Skip to content

Instantly share code, notes, and snippets.

@solson
Created September 18, 2010 08:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save solson/585475 to your computer and use it in GitHub Desktop.
Save solson/585475 to your computer and use it in GitHub Desktop.
Lisp in Ioke
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