(def mem (x ys (o f =)) (some [f _ x] ys)) (def in (x . ys) (mem x ys)) (def cadr (x) (car (cdr x))) (def cddr (x) (cdr (cdr x))) (def caddr (x) (car (cddr x))) (mac case (expr . args) (if (no (cdr args)) (car args) (let v (uvar) `(let ,v ,expr (if (= ,v ',(car args)) ,(cadr args) (case ,v ,@(cddr args))))))) (mac iflet (var . args) (if (no (cdr args)) (car args) (let v (uvar) `(let ,v ,(car args) (if ,v (let ,var ,v ,(cadr args)) (iflet ,var ,@(cddr args))))))) (mac aif args `(iflet it ,@args)) (def find (f xs) (aif (some f xs) (car it))) (def begins (xs pat (o f =)) (if (no pat) t (atom xs) nil (f (car xs) (car pat)) (begins (cdr xs) (cdr pat) f) nil)) (def caris (x y (o f =)) (begins x (list y) f)) (def hug (xs (o f list)) (if (no xs) nil (no (cdr xs)) (list (f (car xs))) (cons (f (car xs) (cadr xs)) (hug (cddr xs) f)))) (mac with (parms . body) (let ps (hug parms) `((fn ,(map car ps) ,@body) ,@(map cadr ps)))) (def keep (f xs) (if (no xs) nil (f (car xs)) (cons (car xs) (keep f (cdr xs))) (keep f (cdr xs)))) (def rem (x ys (o f =)) (keep [no (f _ x)] ys)) (def get (k kvs (o f =)) (find [f (car _) k] kvs)) (def put (k v kvs (o f =)) (cons (cons k v) (rem k kvs (fn (x y) (f (car x) y))))) (def rev (xs) (if (no xs) nil (snoc (rev (cdr xs)) (car xs)))) (def snap (xs ys (o acc)) (if (no xs) (list acc ys) (snap (cdr xs) (cdr ys) (snoc acc (car ys))))) (def udrop (xs ys) (cadr (snap xs ys))) (def idfn (x) x) (def is (x) [= _ x])