shell: more foundations from Lisp
This commit is contained in:
parent
f79ae9ea54
commit
9fd3111ea9
|
@ -9,6 +9,11 @@
|
|||
`((fn (,var) ,@body) ,val))])
|
||||
(when . [(mac (when cond . body)
|
||||
`(if ,cond (do ,@body) ()))])
|
||||
(iflet . [(mac (iflet var expr then else)
|
||||
`(let ,var ,expr
|
||||
(if ,var ,then ,else)))])
|
||||
(aif . [(mac (aif expr then else)
|
||||
`(iflet it ,expr ,then ,else))])
|
||||
(list . [(def (list . args)
|
||||
# we should probably make a copy here
|
||||
args)])
|
||||
|
@ -21,6 +26,45 @@
|
|||
()
|
||||
(cons (f (car xs))
|
||||
(map1 f (cdr xs)))))])
|
||||
(compose . [(def (compose f g)
|
||||
(fn args
|
||||
(f (g args))))])
|
||||
(some . [(def (some f xs)
|
||||
(if (no xs)
|
||||
()
|
||||
(if (f (car xs))
|
||||
xs
|
||||
(some f (cdr xs)))))])
|
||||
(any . some)
|
||||
(all . [(def (all f xs)
|
||||
(if (no xs)
|
||||
1
|
||||
(if (f (car xs))
|
||||
(all f (cdr xs))
|
||||
())))])
|
||||
(find . [(def (find x xs)
|
||||
(if (no xs)
|
||||
()
|
||||
(if (= x (car xs))
|
||||
1
|
||||
(find x (cdr xs)))))])
|
||||
(afn . [(mac (afn params . body)
|
||||
`(let self ()
|
||||
(set self (fn ,params ,@body))))])
|
||||
(rem . [(def (rem f xs)
|
||||
(if (no xs)
|
||||
()
|
||||
(let rest (rem f (cdr xs))
|
||||
(if (f (car xs))
|
||||
rest
|
||||
(cons (car xs) rest)))))])
|
||||
(keep . [(def (keep f xs)
|
||||
(if (no xs)
|
||||
()
|
||||
(let rest (keep f (cdr xs))
|
||||
(if (f (car xs))
|
||||
(cons (car xs) rest)
|
||||
rest))))])
|
||||
(++ . [(mac (++ var) `(set ,var (+ ,var 1)))])
|
||||
(+= . [(mac (+= var inc)
|
||||
`(set ,var (+ ,var ,inc)))])
|
||||
|
|
Loading…
Reference in New Issue