Skip to content

Latest commit

 

History

History
113 lines (86 loc) · 2.48 KB

README.md

File metadata and controls

113 lines (86 loc) · 2.48 KB

Sexy

((real 'programs) have.curves)

Sexy is an object-oriented dialect of Lisp inspired by Scheme, Self, and Perl.

Features:

* Lisp-1
* tail-call optimization
* immutable global environment
* classless object machinery for easy composition and delegation
* delimited lexical scope
* first-class environments
* first-class delimited continuations
* object capability security on operating system interfaces
* restartable exceptions
* dirty Common-Lisp-style macros
* lexically scoped module import via HTTP
* parameterized, recursive modules
* generic procedures with predicate dispatch
* reader literals for text construction and variable interpolation

Detailed documentation lives in the wiki.

There's a TL;DR for those who want a broad overview.

For those who want examples, there are over 1500 lines of Sexy code in the tests directory.

(def foo
    (proc (x y)
        (* x y)))

(sys.stdout.say (foo 3 4))

; -> 12

(proc bar (x y) 
    (if opt.snazz
        (list x y opt.snazz opt.snarf rest)
        (list x y rest)))

(def baz
    (list
        (bar 2 3)
        (bar 2 3 4 5)
        (bar 2 snazz: true 3 4 5)
        (bar 2 snazz: true snarf: "Yarr!" 3 4 5)))

(let loop (x baz.head xs baz.tail)
    (when x
        (seq
            (sys.say x)
            (loop xs.head xs.tail))))

; ->
; (2 3 ())
; (2 3 (4 5))
; (2 3 true null (4 5))
; (2 3 true Yarr! (4 5))

(def fibby
    (proc (x)
        (if (< x 3)
            1
            (+ (fibby (- x 2)) (fibby (- x 1))))))

(def one-to-threen (range 1 13))
    -> (1 2 3 4 5 6 7 8 9 10 11 12 13)

(def things (one-to-threen.map fibby))
    -> (1 1 2 3 5 8 13 21 34 55 89 144 233)

(def r (: x (+ 1 1) y (+ 1 2)))

(def new-dude
    (object
        'type 'new-guy
        'view (list 'new-guy things r.view)
        'info (thunk (sys.say "Still alive!"))
        auto:
            '(info x y)
        resend:
            (list
                (list things 'map 'filter 'sort)
                (list r 'x 'y))
        default:
            (proc (msg)
                (sys.say (cat "What means " msg \?)))))

    -> (new-guy (1 1 2 3 5 8 13 21 34 55 89 144 233) (record: y 3 x 2))

new-dude.info
    -> Still alive!
    -> null

(new-dude.filter (proc (x) (< x 10)))
    -> (1 1 2 3 5 8)

new-dude.x
    -> 2

new-dude.y
    -> 3

new-dude.foonballardy
    -> What means foonballardy?
    -> null