Created
September 18, 2010 08:07
-
-
Save solson/585475 to your computer and use it in GitHub Desktop.
Lisp in Ioke
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Lisp = Ground mimic do( | |
do = dmacro( | |
[+forms] | |
ret = nil | |
forms each(msg, ret = msg evaluateOn(self)) | |
ret | |
) | |
cell("") = dsyntax( | |
[code] | |
rest = code next | |
if(!self cell(code name) cell?(:activatable) || !self cell(code name) cell(:activatable), | |
code next = 'call, | |
code next = nil | |
) | |
if(rest, rest each(x, code last << x)) | |
code last arguments each(next = nil) | |
code | |
, | |
[] | |
list() | |
) | |
[] = dsyntax( | |
[+args] | |
msg = 'list | |
args each(arg, msg last -> arg) | |
''((`msg)) | |
) | |
def = cell(:=) | |
defn = dsyntax( | |
[name, args, body] | |
''(=(`name, fn(`args, `body))) | |
) | |
iokeFn = cell(:fn) | |
fn = dsyntax( | |
[args, body] | |
fnMsg = 'iokeFn | |
if(args name == :[] && args arguments count == 1, | |
args arguments[0] each(msg, | |
fnMsg << msg | |
) | |
fnMsg arguments each(msg, | |
msg next = nil | |
) | |
) | |
if(body name == :', | |
body = body arguments[0] | |
) | |
fnMsg << body | |
fnMsg | |
) | |
(defn add [+args] '(args reduce(+) || 0)) | |
(defn mult [+args] '(args reduce(*) || 1)) | |
(defn inc [x] '(x + 1)) | |
(defn dec [x] '(x - 1)) | |
(defn sub [+args] '( | |
if(args length == 1, | |
-(args[0]), | |
args reduce(-) | |
) | |
)) | |
(defn div [+args] '( | |
if(args length == 1, | |
1 / args[0], | |
args reduce(/) | |
) | |
)) | |
(defn str [+args] '(args map(asText) reduce(+) || "")) | |
(defn map [+fns list] '( | |
list mapFn(*fns) | |
)) | |
(defn range [start end] '(start..end)) | |
(defn partial [f +partArgs] (fn [+restArgs] (f *partArgs *restArgs))) | |
(defn pr [+args] '(args map(inspect) join(" ") print)) | |
(defn prn [+args] '(args map(inspect) join(" ") println)) | |
(defn print [+args] '(args join(" ") print)) | |
(defn println [+args] '(args join(" ") println)) | |
) | |
Lisp do( | |
(def l [1 3 5 7 9]) | |
(def l2 (map (fn [x] (mult x x)) l)) | |
(prn l2) | |
(def greeting "Hello") | |
(def target "World") | |
(println (str greeting ", " target "!")) | |
(prn (map (fn [x] (mult x 2)) (range 1 10))) | |
(prn (map (partial mult 2) (range 1 10))) | |
(prn (map (partial div 2) (range 1 10))) | |
) | |
use("builtin/iik") | |
IIk mainLoop |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment