2024-04-10 20:21:15 -04:00
|
|
|
<> (-- ?x) ()
|
|
|
|
-- ( little endian binary integers )
|
|
|
|
|
|
|
|
-- ( constants )
|
|
|
|
<> zero ((0 nil))
|
|
|
|
<> one ((1 nil))
|
|
|
|
<> two ((0 (1 nil)))
|
|
|
|
<> three ((1 (1 nil)))
|
|
|
|
<> ten ((0 (1 (0 (1 nil)))))
|
|
|
|
|
|
|
|
-- ( decimal digit to binary )
|
|
|
|
<> (binary 0) ((0 nil))
|
|
|
|
<> (binary 1) ((1 nil))
|
|
|
|
<> (binary 2) ((0 (1 nil)))
|
|
|
|
<> (binary 3) ((1 (1 nil)))
|
|
|
|
<> (binary 4) ((0 (0 (1 nil))))
|
|
|
|
<> (binary 5) ((1 (0 (1 nil))))
|
|
|
|
<> (binary 6) ((0 (1 (1 nil))))
|
|
|
|
<> (binary 7) ((1 (1 (1 nil))))
|
|
|
|
<> (binary 8) ((0 (0 (0 (1 nil)))))
|
|
|
|
<> (binary 9) ((1 (0 (0 (1 nil)))))
|
|
|
|
|
|
|
|
-- ( binary to decimal digit )
|
2024-04-11 18:38:49 -04:00
|
|
|
<> ((decimal (0 nil))) (0)
|
|
|
|
<> ((decimal (1 nil))) (1)
|
|
|
|
<> ((decimal (0 (1 nil)))) (2)
|
|
|
|
<> ((decimal (1 (1 nil)))) (3)
|
|
|
|
<> ((decimal (0 (0 (1 nil))))) (4)
|
|
|
|
<> ((decimal (1 (0 (1 nil))))) (5)
|
|
|
|
<> ((decimal (0 (1 (1 nil))))) (6)
|
|
|
|
<> ((decimal (1 (1 (1 nil))))) (7)
|
|
|
|
<> ((decimal (0 (0 (0 (1 nil)))))) (8)
|
|
|
|
<> ((decimal (1 (0 (0 (1 nil)))))) (9)
|
2024-04-10 20:21:15 -04:00
|
|
|
|
|
|
|
-- create nil-terminated list
|
|
|
|
<> (nilify (?h)) ((?h nil))
|
|
|
|
<> (nilify (?h ?t)) ((?h nilify ?t))
|
|
|
|
|
|
|
|
-- reverse nil-terminated list
|
|
|
|
<> (reverse ?x) (reverse' nil ?x)
|
|
|
|
<> (reverse' ?a nil) (?a)
|
|
|
|
<> (reverse' ?a (?h ?t)) (reverse' (?h ?a) ?t)
|
|
|
|
|
2024-04-11 19:03:25 -04:00
|
|
|
-- map
|
|
|
|
<> (map ?f (list ?l)) (map/l map/f ?f ?l)
|
|
|
|
<> (map/f ?f (?h ?t)) (?f ?h (map/f ?f ?t))
|
|
|
|
<> (map/f ?f (?h)) (map/r (?f ?h))
|
|
|
|
<> (?h (map/r ?t)) (map/r (?h ?t))
|
|
|
|
<> (map/l map/r ?l) (list ?l)
|
|
|
|
|
2024-04-10 20:21:15 -04:00
|
|
|
-- ( normalize, remove trailing zeros )
|
|
|
|
-- ( currently zero is (0 nil) though arguably it could be nil )
|
|
|
|
-- ( that change would require auditing our rules )
|
|
|
|
<> (normalize (?h ?t)) ((?h normalize' nil ?t))
|
|
|
|
<> (normalize' ?s nil) (nil)
|
|
|
|
<> (normalize' ?s (0 ?t)) (normalize' (0 ?s) ?t)
|
|
|
|
<> (normalize' nil (1 ?t)) ((1 normalize' nil ?t))
|
|
|
|
<> (normalize' (0 ?s) (1 ?t)) ((0 normalize' ?s (1 ?t)))
|
|
|
|
|
|
|
|
-- ( to integer )
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((int ?*)) ((sum f (one) g reverse nilify (?*)))
|
2024-04-10 20:21:15 -04:00
|
|
|
<> (g nil) (nil)
|
|
|
|
<> (g (?h ?t)) ((binary ?h g ?t))
|
|
|
|
<> (f (?u) nil) (nil)
|
2024-04-10 22:14:47 -04:00
|
|
|
<> (f (?u) (?h ?t)) (((mul ?h ?u) f ((mul ?u ten)) ?t))
|
2024-04-10 20:21:15 -04:00
|
|
|
|
2024-04-11 19:03:25 -04:00
|
|
|
-- ( to binary str )
|
|
|
|
<> ((bstr ?x)) ((bstr1 ?x))
|
|
|
|
<> ((bstr1 (0 nil))) ((0 (b 0)))
|
|
|
|
<> ((bstr1 (1 nil))) ((0 (b 1)))
|
|
|
|
<> ((bstr1 (0 (0 ?c)))) ((bstr2 ?c (0 0)))
|
|
|
|
<> ((bstr1 (1 (0 ?c)))) ((bstr2 ?c (0 1)))
|
|
|
|
<> ((bstr1 (0 (1 ?c)))) ((bstr2 ?c (1 0)))
|
|
|
|
<> ((bstr1 (1 (1 ?c)))) ((bstr2 ?c (1 1)))
|
|
|
|
<> ((bstr2 nil ?z)) ((stringify (0 (b ?z))))
|
|
|
|
<> ((bstr2 (0 ?t) ?z)) ((bstr2 ?t (0 ?z)))
|
|
|
|
<> ((bstr2 (1 ?t) ?z)) ((bstr2 ?t (1 ?z)))
|
|
|
|
|
2024-04-10 20:21:15 -04:00
|
|
|
-- ( to string: TODO, need division for this one )
|
2024-04-11 18:38:49 -04:00
|
|
|
<> ((str ?x)) ((str1 (divmod ?x ten) nil))
|
|
|
|
<> ((str1 (?q ?r) ?a)) ((str2 ?q (?r ?a)))
|
|
|
|
<> ((str2 (0 nil) ?a)) ((str3 ?a nil))
|
|
|
|
<> ((str2 (0 (?h ?t)) ?a)) ((str1 (divmod (0 (?h ?t)) ten) ?a))
|
|
|
|
<> ((str2 (1 ?t) ?a)) ((str1 (divmod (1 ?t) ten) ?a))
|
|
|
|
<> ((str3 nil ?a)) ((digitize ?a nil))
|
|
|
|
<> ((str3 (?h ?t) nil)) ((str3 ?t (decimal ?h)))
|
|
|
|
<> ((str3 (?h ?t) (?a ?b))) ((str3 ?t ((decimal ?h) (?a ?b))))
|
|
|
|
|
|
|
|
<> ((digitize (0 ?t) nil)) ((digitize ?t (0)))
|
|
|
|
<> ((digitize (1 ?t) nil)) ((digitize ?t (1)))
|
|
|
|
<> ((digitize (2 ?t) nil)) ((digitize ?t (2)))
|
|
|
|
<> ((digitize (3 ?t) nil)) ((digitize ?t (3)))
|
|
|
|
<> ((digitize (4 ?t) nil)) ((digitize ?t (4)))
|
|
|
|
<> ((digitize (5 ?t) nil)) ((digitize ?t (5)))
|
|
|
|
<> ((digitize (6 ?t) nil)) ((digitize ?t (6)))
|
|
|
|
<> ((digitize (7 ?t) nil)) ((digitize ?t (7)))
|
|
|
|
<> ((digitize (8 ?t) nil)) ((digitize ?t (8)))
|
|
|
|
<> ((digitize (9 ?t) nil)) ((digitize ?t (9)))
|
|
|
|
|
|
|
|
<> ((digitize (0 ?t) ?a)) ((digitize ?t (0 ?a)))
|
|
|
|
<> ((digitize (1 ?t) ?a)) ((digitize ?t (1 ?a)))
|
|
|
|
<> ((digitize (2 ?t) ?a)) ((digitize ?t (2 ?a)))
|
|
|
|
<> ((digitize (3 ?t) ?a)) ((digitize ?t (3 ?a)))
|
|
|
|
<> ((digitize (4 ?t) ?a)) ((digitize ?t (4 ?a)))
|
|
|
|
<> ((digitize (5 ?t) ?a)) ((digitize ?t (5 ?a)))
|
|
|
|
<> ((digitize (6 ?t) ?a)) ((digitize ?t (6 ?a)))
|
|
|
|
<> ((digitize (7 ?t) ?a)) ((digitize ?t (7 ?a)))
|
|
|
|
<> ((digitize (8 ?t) ?a)) ((digitize ?t (8 ?a)))
|
|
|
|
<> ((digitize (9 ?t) ?a)) ((digitize ?t (9 ?a)))
|
|
|
|
|
|
|
|
<> ((digitize 0 ?a)) ((stringify (0 ?a)))
|
|
|
|
<> ((digitize 1 ?a)) ((stringify (1 ?a)))
|
|
|
|
<> ((digitize 2 ?a)) ((stringify (2 ?a)))
|
|
|
|
<> ((digitize 3 ?a)) ((stringify (3 ?a)))
|
|
|
|
<> ((digitize 4 ?a)) ((stringify (4 ?a)))
|
|
|
|
<> ((digitize 5 ?a)) ((stringify (5 ?a)))
|
|
|
|
<> ((digitize 6 ?a)) ((stringify (6 ?a)))
|
|
|
|
<> ((digitize 7 ?a)) ((stringify (7 ?a)))
|
|
|
|
<> ((digitize 8 ?a)) ((stringify (8 ?a)))
|
|
|
|
<> ((digitize 9 ?a)) ((stringify (9 ?a)))
|
|
|
|
|
2024-04-10 20:21:15 -04:00
|
|
|
-- ( comparison operartions )
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((cmp ?x ?y)) ((cmpc #eq ?x ?y))
|
|
|
|
<> ((cmpc ?e nil nil)) (?e)
|
|
|
|
<> ((cmpc ?e (1 ?x) nil)) (#gt)
|
|
|
|
<> ((cmpc ?e (0 ?x) nil)) ((cmpc ?e ?x nil))
|
|
|
|
<> ((cmpc ?e nil (1 ?y))) (#lt)
|
|
|
|
<> ((cmpc ?e nil (0 ?y))) ((cmpc ?e nil ?y))
|
|
|
|
<> ((cmpc ?e (0 ?x) (0 ?y))) ((cmpc ?e ?x ?y))
|
|
|
|
<> ((cmpc ?e (1 ?x) (0 ?y))) ((cmpc #gt ?x ?y))
|
|
|
|
<> ((cmpc ?e (0 ?x) (1 ?y))) ((cmpc #lt ?x ?y))
|
|
|
|
<> ((cmpc ?e (1 ?x) (1 ?y))) ((cmpc ?e ?x ?y))
|
2024-04-10 20:21:15 -04:00
|
|
|
|
|
|
|
-- ( addition )
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((add ?x ?y)) (addc 0 ?x ?y)
|
2024-04-10 20:21:15 -04:00
|
|
|
<> (addc 0 nil nil) (nil)
|
|
|
|
<> (addc 1 nil nil) ((1 nil))
|
|
|
|
<> (addc ?c ?x nil) (addc ?c ?x (0 nil))
|
|
|
|
<> (addc ?c nil ?y) (addc ?c (0 nil) ?y)
|
|
|
|
<> (addc 0 (0 ?x) (0 ?y)) ((0 addc 0 ?x ?y))
|
|
|
|
<> (addc 0 (0 ?x) (1 ?y)) ((1 addc 0 ?x ?y))
|
|
|
|
<> (addc 0 (1 ?x) (0 ?y)) ((1 addc 0 ?x ?y))
|
|
|
|
<> (addc 0 (1 ?x) (1 ?y)) ((0 addc 1 ?x ?y))
|
|
|
|
<> (addc 1 (0 ?x) (0 ?y)) ((1 addc 0 ?x ?y))
|
|
|
|
<> (addc 1 (0 ?x) (1 ?y)) ((0 addc 1 ?x ?y))
|
|
|
|
<> (addc 1 (1 ?x) (0 ?y)) ((0 addc 1 ?x ?y))
|
|
|
|
<> (addc 1 (1 ?x) (1 ?y)) ((1 addc 1 ?x ?y))
|
|
|
|
|
|
|
|
-- ( summation )
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((sum nil)) ((0 nil))
|
|
|
|
<> ((sum (?a nil))) (?a)
|
|
|
|
<> ((sum (?a (?b ?c)))) ((sum ((add ?a ?b) ?c)))
|
2024-04-10 20:21:15 -04:00
|
|
|
|
|
|
|
-- ( multiplication )
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((mul ?x ?y)) (mulc nil ?x ?y)
|
|
|
|
<> (mulc ?t nil ?y) ((sum ?t))
|
2024-04-10 20:21:15 -04:00
|
|
|
<> (mulc ?t (0 ?x) ?y) (mulc ?t ?x (0 ?y))
|
|
|
|
<> (mulc ?t (1 ?x) ?y) (mulc (?y ?t) ?x (0 ?y))
|
|
|
|
|
|
|
|
-- ( subtraction )
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((sub ?x ?y)) (normalize subc 0 ?x ?y)
|
2024-04-10 20:21:15 -04:00
|
|
|
<> (subc 0 nil nil) (nil)
|
|
|
|
<> (subc 1 nil nil) (#err)
|
|
|
|
<> (subc 0 ?x nil) (?x)
|
|
|
|
<> (subc 1 ?x nil) (subc 1 ?x (0 nil))
|
|
|
|
<> (subc ?c nil ?y) (subc ?c (0 nil) ?y)
|
|
|
|
<> (subc 0 (0 ?x) (0 ?y)) ((0 subc 0 ?x ?y))
|
|
|
|
<> (subc 0 (0 ?x) (1 ?y)) ((1 subc 1 ?x ?y))
|
|
|
|
<> (subc 0 (1 ?x) (0 ?y)) ((1 subc 0 ?x ?y))
|
|
|
|
<> (subc 0 (1 ?x) (1 ?y)) ((0 subc 0 ?x ?y))
|
|
|
|
<> (subc 1 (0 ?x) (0 ?y)) ((1 subc 1 ?x ?y))
|
|
|
|
<> (subc 1 (0 ?x) (1 ?y)) ((0 subc 1 ?x ?y))
|
|
|
|
<> (subc 1 (1 ?x) (0 ?y)) ((0 subc 0 ?x ?y))
|
|
|
|
<> (subc 1 (1 ?x) (1 ?y)) ((1 subc 1 ?x ?y))
|
|
|
|
|
|
|
|
-- ( dec )
|
|
|
|
<> (dec (0 nil)) (#err)
|
|
|
|
<> (dec ?x) (normalize dec' ?x)
|
|
|
|
<> (dec' (0 ?t)) ((1 dec' ?t))
|
|
|
|
<> (dec' (1 ?t)) ((0 ?t))
|
|
|
|
|
2024-04-10 22:14:47 -04:00
|
|
|
-- ( inc )
|
|
|
|
<> ((inc nil)) ((1 nil))
|
|
|
|
<> ((inc (0 ?t))) ((1 ?t))
|
|
|
|
<> ((inc (1 ?t))) ((0 (inc ?t)))
|
2024-04-10 20:21:15 -04:00
|
|
|
|
2024-04-10 22:14:47 -04:00
|
|
|
-- ( left shift; lshift x b means x<<b )
|
|
|
|
<> ((lshift ?x (0 nil))) (?x)
|
|
|
|
<> ((lshift ?x (1 nil))) ((0 ?x))
|
|
|
|
<> ((lshift ?x (?h (?a ?b)))) ((lshift (0 ?x) dec (?h (?a ?b))))
|
|
|
|
|
|
|
|
-- ( divmod, i.e. quotient and remainder )
|
|
|
|
<> ((divmod ?x ?y)) ((divmod1 ?x ?y (cmp ?x ?y)))
|
2024-04-11 18:38:49 -04:00
|
|
|
<> ((divmod1 ?x ?y #lt)) ((zero ?x))
|
|
|
|
<> ((divmod1 ?x ?y #eq)) ((one zero))
|
2024-04-10 22:14:47 -04:00
|
|
|
<> ((divmod1 ?x ?y #gt)) ((divmod2 ?x ?y zero (0 ?y)))
|
|
|
|
<> ((divmod2 ?x ?y ?s ?m)) ((divmod3 ?x ?y ?s ?m (cmp ?x ?m)))
|
|
|
|
<> ((divmod3 ?x ?y ?s ?m #lt)) ((divmod4 ?x ?y ?s zero))
|
|
|
|
<> ((divmod3 ?x ?y ?s ?m #eq)) ((divmod4 ?x ?y (inc ?s) zero))
|
|
|
|
<> ((divmod3 ?x ?y ?s ?m #gt)) ((divmod2 ?x ?y (inc ?s) (0 ?m)))
|
|
|
|
<> ((divmod4 ?x ?y (0 nil) ?d)) (((add ?d one) (sub ?x ?y)))
|
|
|
|
<> ((divmod4 ?x ?y ?s ?d)) ((divmod5 (sub ?x (lshift ?y ?s)) ?y dec ?s (add ?d (lshift one ?s))))
|
|
|
|
<> ((divmod5 (0 nil) ?y ?s ?d)) ((?d (0 nil)))
|
|
|
|
<> ((divmod5 ?x ?y ?s ?d)) ((divmod6 ?x ?y ?s ?d (cmp ?x (lshift ?y ?s))))
|
|
|
|
<> ((divmod6 ?x ?y (0 nil) ?d #lt)) ((?d ?x))
|
|
|
|
<> ((divmod6 ?x ?y ?s ?d #lt)) ((divmod5 ?x ?y dec ?s ?d))
|
|
|
|
<> ((divmod6 ?x ?y ?s ?d #eq)) ((divmod4 ?x ?y ?s ?d))
|
|
|
|
<> ((divmod6 ?x ?y ?s ?d #gt)) ((divmod4 ?x ?y ?s ?d))
|
|
|
|
|
|
|
|
-- ( floor divison )
|
|
|
|
<> ((div ?x ?y)) ((div' (divmod ?x ?y)))
|
|
|
|
<> ((div' (?q ?r))) (?q)
|
|
|
|
|
|
|
|
-- ( remainder )
|
|
|
|
<> ((mod ?x ?y)) ((mod' (divmod ?x ?y)))
|
|
|
|
<> ((mod' (?q ?r))) (?r)
|
|
|
|
|
2024-04-11 19:03:25 -04:00
|
|
|
-- ( stringify )
|
|
|
|
<> ((stringify ?*)) (?*)
|
|
|
|
|
|
|
|
(bstr (mul (int 2399) (int 3499)))
|