1*12834Sbaden (setq SCCS-primFp.l "@(#)primFp.l 1.3 05/30/83") 212070Sbaden ; FP interpreter/compiler 312070Sbaden ; Copyright (c) 1982 Scott B. Baden 412070Sbaden ; Berkeley, California 512070Sbaden 612070Sbaden (include specials.l) 712070Sbaden (declare (special y_l z_l) 812070Sbaden (localf ok_pair ok_eqpair rpair$ lpair$ trnspz allNulls 912092Sbaden allLists emptyHeader treeInsWithLen)) 1012070Sbaden 1112070Sbaden ; fp addition 1212070Sbaden 1312070Sbaden (defun plus$fp (x) 1412070Sbaden (cond (DynTraceFlg (IncrTimes 'plus$fp))) 1512070Sbaden (cond ((ok_pair x 'numberp) (plus (car x) (cadr x))) 1612070Sbaden (t (bottom)))) 1712070Sbaden 1812070Sbaden ; unit function 1912070Sbaden 2012070Sbaden (defun (u-fnc plus$fp) nil 2112070Sbaden 0) 2212070Sbaden 2312070Sbaden ; fp subtraction 2412070Sbaden 2512070Sbaden (defun sub$fp (x) 2612070Sbaden (cond (DynTraceFlg (IncrTimes 'sub$fp))) 2712070Sbaden (cond ((ok_pair x 'numberp) (diff (car x) (cadr x))) 2812070Sbaden (t (bottom)))) 2912070Sbaden 3012070Sbaden 3112070Sbaden ; unit function 3212070Sbaden 3312070Sbaden (defun (u-fnc sub$fp) nil 3412070Sbaden 0) 3512070Sbaden 3612070Sbaden ; fp multiplication 3712070Sbaden 3812070Sbaden (defun times$fp (x) 3912070Sbaden (cond (DynTraceFlg (IncrTimes 'times$fp))) 4012070Sbaden (cond ((ok_pair x 'numberp) (product (car x) (cadr x))) 4112070Sbaden (t (bottom)))) 4212070Sbaden 4312070Sbaden ; unit function 4412070Sbaden 4512070Sbaden (defun (u-fnc times$fp) nil 4612070Sbaden 1) 4712070Sbaden 4812070Sbaden 4912070Sbaden ; fp division 5012070Sbaden 5112070Sbaden (defun div$fp (x) 5212070Sbaden (cond (DynTraceFlg (IncrTimes 'div$fp))) 5312070Sbaden (cond ((ok_pair x 'numberp) 5412070Sbaden (cond ((not (zerop (cadr x))) 5512070Sbaden (quotient (car x) (cadr x))) 5612070Sbaden (t (bottom)))) 5712070Sbaden (t (bottom)))) 5812070Sbaden 5912070Sbaden ; unit function 6012070Sbaden 6112070Sbaden (defun (u-fnc div$fp) nil 6212070Sbaden 1) 6312070Sbaden 6412070Sbaden 6512070Sbaden 6612070Sbaden ; logical functions, and or xor not 6712070Sbaden 6812070Sbaden (defun and$fp (x) 6912070Sbaden (cond (DynTraceFlg (IncrTimes 'and$fp))) 7012070Sbaden (cond ((ok_pair x 'boolp) 7112070Sbaden (cond 7212070Sbaden ((eq 'F (car x)) 'F) 7312070Sbaden (t (cadr x)))) 7412070Sbaden (t (bottom)))) 7512070Sbaden 7612070Sbaden ; unit function 7712070Sbaden 7812070Sbaden (defun (u-fnc and$fp) nil 7912070Sbaden 'T) 8012070Sbaden 8112070Sbaden 8212070Sbaden (defun or$fp (x) 8312070Sbaden (cond (DynTraceFlg (IncrTimes 'or$fp))) 8412070Sbaden (cond ((ok_pair x 'boolp) 8512070Sbaden (cond 8612070Sbaden ((eq 'T (car x)) 'T) 8712070Sbaden (t (cadr x)))) 8812070Sbaden (t (bottom)))) 8912070Sbaden 9012070Sbaden ; unit function 9112070Sbaden 9212070Sbaden (defun (u-fnc or$fp) nil 9312070Sbaden 'F) 9412070Sbaden 9512070Sbaden 9612070Sbaden (defun xor$fp (x) 9712070Sbaden (cond (DynTraceFlg (IncrTimes 'xor$fp))) 9812070Sbaden (cond ((ok_pair x 'boolp) 9912070Sbaden (let ((p (car x)) 10012070Sbaden (q (cadr x))) 10112070Sbaden (cond ((or (and (eq p 'T) (eq q 'T)) 10212070Sbaden (and (eq p 'F) (eq q 'F))) 10312070Sbaden 'F) 10412070Sbaden (t 'T)))) 10512070Sbaden (t (bottom)))) 10612070Sbaden 10712070Sbaden ; unit function 10812070Sbaden 10912070Sbaden (defun (u-fnc xor$fp) nil 11012070Sbaden 'F) 11112070Sbaden 11212070Sbaden 11312070Sbaden (defun not$fp (x) 11412070Sbaden (cond (DynTraceFlg (IncrTimes 'not$fp))) 11512070Sbaden (cond ((not (atom x)) (bottom)) 11612070Sbaden ((boolp x) (cond ((eq x 'T) 'F) (t 'T))) 11712070Sbaden (t (bottom)))) 11812070Sbaden 11912070Sbaden 12012070Sbaden ; relational operators, < <= = >= > ~= 12112070Sbaden 12212070Sbaden (defun lt$fp (x) 12312070Sbaden (cond (DynTraceFlg (IncrTimes 'lt$fp))) 12412070Sbaden (cond ((ok_pair x 'numberp) 12512070Sbaden (cond ((lessp (car x) (cadr x)) 'T) 12612070Sbaden (t 'F))) 12712070Sbaden (t (bottom)))) 12812070Sbaden 12912070Sbaden (defun le$fp (x) 13012070Sbaden (cond (DynTraceFlg (IncrTimes 'le$fp))) 13112070Sbaden (cond ((ok_pair x 'numberp) 13212070Sbaden (cond ((not (greaterp (car x) (cadr x))) 'T) 13312070Sbaden (t 'F))) 13412070Sbaden (t (bottom)))) 13512070Sbaden 13612070Sbaden (defun eq$fp (x) 13712070Sbaden (cond (DynTraceFlg (IncrTimes 'eq$fp))) 13812070Sbaden (cond ((ok_eqpair x ) 13912070Sbaden (cond ((equal (car x) (cadr x)) 'T) 14012070Sbaden (t 'F))) 14112070Sbaden (t (bottom)))) 14212070Sbaden 14312070Sbaden (defun ge$fp (x) 14412070Sbaden (cond (DynTraceFlg (IncrTimes 'ge$fp))) 14512070Sbaden (cond ((ok_pair x 'numberp) 14612070Sbaden (cond ((not (lessp (car x) (cadr x))) 'T) 14712070Sbaden (t 'F))) 14812070Sbaden (t (bottom)))) 14912070Sbaden 15012070Sbaden (defun gt$fp (x) 15112070Sbaden (cond (DynTraceFlg (IncrTimes 'gt$fp))) 15212070Sbaden (cond ((ok_pair x 'numberp) 15312070Sbaden (cond ((greaterp (car x) (cadr x)) 'T) 15412070Sbaden (t 'F))) 15512070Sbaden (t (bottom)))) 15612070Sbaden 15712070Sbaden (defun ne$fp (x) 15812070Sbaden (cond (DynTraceFlg (IncrTimes 'ne$fp))) 15912070Sbaden (cond ((ok_eqpair x) 16012070Sbaden (cond ((not (equal (car x) (cadr x))) 'T) 16112070Sbaden (t 'F))) 16212070Sbaden (t (bottom)))) 16312070Sbaden 16412070Sbaden 16512070Sbaden 16612070Sbaden ; check arguments for eq and ne 16712070Sbaden 16812070Sbaden (defun ok_eqpair (x) 16912070Sbaden (cond ((not (atom x)) 17012070Sbaden (cond ((eq (length x) 2) t))))) 17112070Sbaden 17212070Sbaden ; check arguments for binary arithmetics/logicals 17312070Sbaden 17412070Sbaden (defun ok_pair (x typ) 17512070Sbaden (cond ((not (atom x)) 17612070Sbaden (cond ((eq (length x) 2) 17712070Sbaden (cond 17812070Sbaden ((and (atom (car x)) (atom (cadr x))) 17912070Sbaden (cond ((and (funcall typ (car x)) 18012070Sbaden (funcall typ (cadr x))) t))))))))) 18112070Sbaden 18212070Sbaden ; check if a variable is boolean, 'T' or 'F' 18312070Sbaden 18412070Sbaden (defun boolp (x) 18512070Sbaden (memq x '(T F))) 18612070Sbaden 18712070Sbaden 18812070Sbaden (defun undefp (x) 18912070Sbaden (eq x '?)) 19012070Sbaden 19112070Sbaden (defun tl$fp (x) 19212070Sbaden (cond (DynTraceFlg (IncrSize 'tl$fp (size x)) (IncrTimes 'tl$fp))) 19312070Sbaden (cond ((atom x) (bottom)) 19412070Sbaden (t (cdr x)))) 19512070Sbaden 19612070Sbaden 19712070Sbaden (defun tlr$fp (x) 19812070Sbaden (cond (DynTraceFlg (IncrSize 'tlr$fp (size x)) (IncrTimes 'tlr$fp))) 19912070Sbaden (cond ((listp x) (cond 20012070Sbaden ((onep (length x)) nil) 20112070Sbaden (t (reverse (cdr (reverse x)))))) 20212070Sbaden (t (bottom)))) 20312070Sbaden 20412070Sbaden ; this function is just like id$fp execept it also prints its 20512070Sbaden ; argument on the stdout. It is meant to be used only for debuging. 20612070Sbaden 20712070Sbaden (defun out$fp (x) 20812070Sbaden (fpPP x) 20912070Sbaden (terpri) 21012070Sbaden x) 21112070Sbaden 21212070Sbaden (defun id$fp (x) 21312070Sbaden (cond (DynTraceFlg (IncrSize 'id$fp (size x)) (IncrTimes 'id$fp))) 21412070Sbaden x) 21512070Sbaden 21612070Sbaden (defun atom$fp (x) 21712070Sbaden (cond (DynTraceFlg (IncrSize 'atom$fp (size x)) (IncrTimes 'atom$fp))) 21812070Sbaden (cond ((atom x) 'T) 21912070Sbaden (t 'F))) 22012070Sbaden 22112070Sbaden (defun null$fp (x) 22212070Sbaden (cond (DynTraceFlg (IncrSize 'null$fp (size x)) (IncrTimes 'null$fp))) 22312070Sbaden (cond ((null x) 'T) 22412070Sbaden (t 'F))) 22512070Sbaden 22612070Sbaden (defun reverse$fp (x) 22712070Sbaden (cond (DynTraceFlg (IncrSize 'reverse$fp (size x)) (IncrTimes 'reverse$fp))) 22812070Sbaden (cond ((null x) x) 22912070Sbaden ((listp x) (reverse x)) 23012070Sbaden (t (bottom)))) 23112070Sbaden 23212070Sbaden (defun lpair$ (x) 23312070Sbaden (cond ((or (undefp x) (not (listp x))) nil) 23412070Sbaden (t 23512070Sbaden (setq y_l (car x)) 23612070Sbaden (setq z_l (cdr x)) 23712070Sbaden (cond ((null z_l) t) 23812070Sbaden (t (cond ((or (not (listp z_l)) (not (onep (length z_l)))) nil) 23912070Sbaden (t (listp (setq z_l (car z_l)))))))))) 24012070Sbaden 24112070Sbaden (defun rpair$ (x) 24212070Sbaden (cond ((or (undefp x) (not (listp x))) nil) 24312070Sbaden (t 24412070Sbaden (setq y_l (car x)) 24512070Sbaden (setq z_l (cdr x)) 24612070Sbaden (cond ((null y_l) t) 24712070Sbaden (t (cond ((not (listp y_l)) nil) 24812070Sbaden (t (setq z_l (car z_l)) t))))))) 24912070Sbaden 25012070Sbaden 25112070Sbaden (defun distl$fp (x) 25212070Sbaden (let ((y_l nil) (z_l nil)) 25312070Sbaden (cond ((lpair$ x) 25412070Sbaden (cond (DynTraceFlg 25512070Sbaden (IncrSize 'distl$fp (size z_l)) (IncrTimes 'distl$fp))) 25612070Sbaden (mapcar '(lambda (u) (list y_l u)) z_l)) 25712070Sbaden (t (bottom))))) 25812070Sbaden 25912070Sbaden (defun distr$fp (x) 26012070Sbaden (let ((y_l nil) (z_l nil)) 26112070Sbaden (cond ((rpair$ x) 26212070Sbaden (cond (DynTraceFlg 26312070Sbaden (IncrSize 'distr$fp (size y_l)) (IncrTimes 'distr$fp))) 26412070Sbaden (mapcar '(lambda (u) (list u z_l)) y_l)) 26512070Sbaden (t (bottom))))) 26612070Sbaden 26712070Sbaden 26812070Sbaden (defun length$fp (x) 26912070Sbaden (cond (DynTraceFlg (IncrSize 'length$fp (size x)) (IncrTimes 'length$fp))) 27012070Sbaden (cond ((listp x) (length x)) 27112070Sbaden (t (bottom)))) 27212070Sbaden 27312070Sbaden (defun apndl$fp (x) 27412070Sbaden (cond ((and (dtpr x) (eq 2 (length x)) (listp (cadr x))) 27512070Sbaden (cond (DynTraceFlg 27612070Sbaden (IncrSize 'apndl$fp (size (cadr x))) (IncrTimes 'apndl$fp))) 27712070Sbaden (cons (car x) (cadr x))) 27812070Sbaden (t (bottom)))) 27912070Sbaden 28012070Sbaden 28112070Sbaden (defun apndr$fp (x) 28212070Sbaden (cond ((and (dtpr x) (eq 2 (length x)) (listp (car x))) 28312070Sbaden (cond (DynTraceFlg 28412070Sbaden (IncrSize 'apndr$fp (size (car x))) (IncrTimes 'apndr$fp))) 28512070Sbaden (append (car x) (cdr x))) 28612070Sbaden (t (bottom)))) 28712070Sbaden 28812070Sbaden 28912070Sbaden (defun rotl$fp (x) 29012070Sbaden (cond (DynTraceFlg (IncrSize 'rotl$fp (size x)) (IncrTimes 'rotl$fp))) 29112070Sbaden (cond ((null x) x) 29212070Sbaden ((listp x) (cond ((onep (length x)) x) 29312070Sbaden (t (append (cdr x) (list (car x)))))) 29412070Sbaden (t (bottom)))) 29512070Sbaden 29612070Sbaden (defun rotr$fp (x) 29712070Sbaden (cond (DynTraceFlg (IncrSize 'rotr$fp (size x)) (IncrTimes 'rotr$fp))) 29812070Sbaden (cond ((null x) x) 29912070Sbaden ((listp x) (cond ((onep (length x)) x) 30012070Sbaden (t (reverse (rotl$fp (reverse x)))))) 30112070Sbaden (t (bottom)))) 30212070Sbaden 30312070Sbaden 30412070Sbaden (defun trans$fp (x) 30512092Sbaden (If (and (listp x) (allLists x)) 30612070Sbaden then (If (allNulls x) 30712070Sbaden then 30812070Sbaden (cond (DynTraceFlg 30912070Sbaden (IncrSize 'trans$fp (size x)) 31012070Sbaden (IncrTimes 'trans$fp))) 31112070Sbaden nil 31212070Sbaden 31312070Sbaden else 31412070Sbaden (cond (DynTraceFlg 31512070Sbaden (IncrSize 'trans$fp 31612070Sbaden (+ (size (car x)) 31712070Sbaden (size (cadr x)))) (IncrTimes 'trans$fp))) 31812070Sbaden 31912070Sbaden (do ((a x (cdr a)) 32012070Sbaden (f (length (car x)))) 32112070Sbaden ((null a) (trnspz x)) 32212070Sbaden (If (or (not (listp (car a))) (not (eq f (length (car a))))) 32312070Sbaden then (bottom)))) 32412070Sbaden else 32512070Sbaden 32612070Sbaden (bottom))) 32712070Sbaden 32812070Sbaden (defun allNulls (x) 32912070Sbaden (do ((a x (cdr a))) 33012070Sbaden ((null a) t) 33112070Sbaden (If (car a) then (return nil)))) 33212070Sbaden 33312092Sbaden (defun allLists (x) 33412092Sbaden (do ((a x (cdr a))) 33512092Sbaden ((null a) t) 33612092Sbaden (If (not (dtpr (car a))) then (return nil)))) 33712070Sbaden 33812092Sbaden 33912070Sbaden (defun trnspz (l) 34012070Sbaden (do 34112070Sbaden ((h (emptyHeader (length (car l)))) 34212070Sbaden (v l (cdr v))) 34312070Sbaden ((null v) (mapcar 'car h)) 34412070Sbaden (mapcar #'(lambda (x y) (tconc x y)) h (car v)))) 34512070Sbaden 34612070Sbaden 34712070Sbaden (defun emptyHeader (n) 34812070Sbaden (do 34912070Sbaden ((r nil) 35012070Sbaden (c n (1- c))) 35112070Sbaden ((= c 0) r) 35212070Sbaden (setq r (cons (ncons nil) r)))) 35312070Sbaden 35412070Sbaden 35512070Sbaden (defun iota$fp (x) 35612070Sbaden (cond (DynTraceFlg (IncrTimes 'iota$fp))) 35712070Sbaden (cond ((undefp x) x) 35812070Sbaden ((listp x) (bottom)) 35912070Sbaden ((not (fixp x)) (bottom)) 36012070Sbaden ((lessp x 0) (bottom)) 36112070Sbaden ((zerop x) nil) 36212070Sbaden (t 36312070Sbaden (do ((z x (1- z)) 36412070Sbaden (rslt nil)) 36512070Sbaden ((zerop z) rslt) 36612070Sbaden (setq rslt (cons z rslt)))))) 36712070Sbaden 36812070Sbaden ; this is the stuff that was added by dorab patel to make this have 36912070Sbaden ; the same functions as David Lahti's interpreter 37012070Sbaden 37112070Sbaden 37212070Sbaden ;; Modified by SBB to accept nil as a valid input 37312070Sbaden 37412070Sbaden (defun last$fp (x) 37512070Sbaden (cond (DynTraceFlg (IncrSize 'last$fp (size x)) (IncrTimes 'last$fp))) 37612070Sbaden (cond ((null x) nil) 37712070Sbaden ((listp x) (car (last x))) 37812070Sbaden (t (bottom)))) 37912070Sbaden 38012070Sbaden ;; Added by SBB 38112070Sbaden 38212070Sbaden (defun first$fp (x) 38312070Sbaden (If DynTraceFlg then (IncrSize 'first$fp (size x)) (IncrTimes 'first$fp)) 38412070Sbaden (If (not (listp x)) then (bottom) 38512070Sbaden else (car x))) 38612070Sbaden 38712070Sbaden (defun front$fp (x) 38812070Sbaden (cond (DynTraceFlg (IncrSize 'front$fp (size x)) (IncrTimes 'front$fp))) 38912070Sbaden (cond ((null x) (bottom)) 39012092Sbaden ((listp x) (reverse (cdr (reverse x)))) 39112070Sbaden (t (bottom)))) 39212070Sbaden 39312070Sbaden (defun pick$fp (sAndX) 39412070Sbaden (let ((s (car sAndX)) 39512070Sbaden (x (cadr sAndX))) 396*12834Sbaden (If (or (not (fixp s)) (zerop s) (cddr sAndX)) then (bottom) 39712070Sbaden else 39812070Sbaden 39912070Sbaden (progn 40012070Sbaden (cond (DynTraceFlg 40112070Sbaden (IncrTimes 'select$fp) 40212070Sbaden (IncrSize 'select$fp (size x)))) 40312070Sbaden 40412070Sbaden (cond ((not (listp x)) (bottom)) 40512070Sbaden ((plusp s) 40612070Sbaden (If (greaterp s (length x)) then (bottom) 40712070Sbaden else (nthelem s x))) 40812070Sbaden ((minusp s) 40912070Sbaden (let ((len (length x))) 41012070Sbaden (If (greaterp (absval s) len) then (bottom) 41112070Sbaden else (nthelem (plus len 1 s) x))))))))) 41212070Sbaden 41312070Sbaden 41412070Sbaden (defun concat$fp (x) 41512070Sbaden (cond (DynTraceFlg (IncrSize 'concat$fp (size x)) (IncrTimes 'concat$fp))) 41612070Sbaden 41712070Sbaden (If (listp x) 41812070Sbaden then 41912070Sbaden (do ((a x (cdr a)) 42012070Sbaden (y (copy x) (cdr y)) 42112070Sbaden (rslt (ncons nil))) 42212070Sbaden ((null a) (car rslt)) 42312070Sbaden (If (not (listp (car a))) then (bottom)) 42412070Sbaden 42512070Sbaden (lconc rslt (car y))) 42612070Sbaden 42712070Sbaden else (bottom))) 42812070Sbaden 42912070Sbaden 43012070Sbaden (defun pair$fp (x) 43112070Sbaden (cond (DynTraceFlg (IncrSize 'pair$fp (size x)) (IncrTimes 'pair$fp))) 43212092Sbaden (cond ((not (listp x)) (bottom)) 43312092Sbaden ((null x) (bottom)) 43412092Sbaden (t (do ((count 0 (add count 2)) ; set local vars 43512092Sbaden (max (length x)) 43612092Sbaden (ret (ncons nil))) 43712092Sbaden ((not (lessp count max)) (car ret)) ; return car of tconc struc 43812092Sbaden (cond ((equal (diff max count) 1) ; if only one element left 43912092Sbaden (tconc ret (list (car x)))) 44012092Sbaden (t (tconc ret (list (car x) (cadr x))) 44112092Sbaden (setq x (cddr x)))))))) 44212070Sbaden 44312070Sbaden 44412070Sbaden (defun split$fp (x) 44512070Sbaden (cond (DynTraceFlg (IncrSize 'split$fp (size x)) (IncrTimes 'split$fp))) 44612070Sbaden (cond ((not (listp x)) (bottom)) 44712070Sbaden ((null x) (bottom)) 44812070Sbaden ((eq (length x) 1) (list x nil)) 44912070Sbaden (t 45012070Sbaden (do ((count 1 (add1 count)) 45112070Sbaden (mid (fix (plus 0.5 (quotient (length x) 2.0)))) 45212070Sbaden (ret nil)) 45312070Sbaden ((greaterp count mid) (cons (nreverse ret) (list x))) 45412070Sbaden (setq ret (cons (car x) ret)) 45512070Sbaden (setq x (cdr x)))))) 45612070Sbaden 45712070Sbaden 45812070Sbaden ; Library functions: sin, asin, cos, acos, log, exp, mod 45912070Sbaden 46012070Sbaden (defun sin$fp (x) 46112070Sbaden (cond (DynTraceFlg (IncrTimes 'sin$fp))) 46212070Sbaden (cond ((numberp x) (sin x)) 46312070Sbaden (t (bottom)))) 46412070Sbaden 46512070Sbaden (defun asin$fp (x) 46612070Sbaden (cond (DynTraceFlg (IncrTimes 'asin$fp))) 46712070Sbaden (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (asin x)) 46812070Sbaden (t (bottom)))) 46912070Sbaden 47012070Sbaden (defun cos$fp (x) 47112070Sbaden (cond (DynTraceFlg (IncrTimes 'cos$fp))) 47212070Sbaden (cond ((numberp x) (cos x)) 47312070Sbaden (t (bottom)))) 47412070Sbaden 47512070Sbaden (defun acos$fp (x) 47612070Sbaden (cond (DynTraceFlg (IncrTimes 'acos$fp))) 47712070Sbaden (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (acos x)) 47812070Sbaden (t (bottom)))) 47912070Sbaden 48012070Sbaden (defun log$fp (x) 48112070Sbaden (cond (DynTraceFlg (IncrTimes 'log$fp))) 48212070Sbaden (cond ((and (numberp x) (not (minusp x))) (log x)) 48312070Sbaden (t (bottom)))) 48412070Sbaden 48512070Sbaden (defun exp$fp (x) 48612070Sbaden (cond (DynTraceFlg (IncrTimes 'exp$fp))) 48712070Sbaden (cond ((numberp x) (exp x)) 48812070Sbaden (t (bottom)))) 48912070Sbaden 49012070Sbaden (defun mod$fp (x) 49112070Sbaden (cond (DynTraceFlg (IncrTimes 'mod$fp))) 49212070Sbaden (cond ((ok_pair x 'numberp) (mod (car x) (cadr x))) 49312070Sbaden (t (bottom)))) 49412070Sbaden 49512070Sbaden 49612070Sbaden ;; Tree insert function 49712070Sbaden 49812070Sbaden 49912070Sbaden (defun treeIns$fp (fn x) 50012070Sbaden (If (not (listp x)) then (bottom) 50112070Sbaden else 50212070Sbaden (If (null x) then (unitTreeInsert fn) 50312070Sbaden else 50412070Sbaden (let ((len (length x))) 50512070Sbaden (If (onep len) then (car x) 50612070Sbaden else 50712070Sbaden (If (twop len) then (funcall fn x ) 50812070Sbaden else (treeInsWithLen fn x len))))))) 50912070Sbaden 51012070Sbaden 51112070Sbaden (defun treeInsWithLen (fn x len) 51212070Sbaden (let* ((r1 (copy x)) 51312070Sbaden (nLen (fix (plus 0.5 (quotient len 2.0)))) 51412070Sbaden (p (Cnth r1 nLen)) 51512070Sbaden (r2 (cdr p))) 51612070Sbaden (rplacd p nil) 51712070Sbaden (let ((saveLevel level)) 51812070Sbaden (setq level (1+ level)) 51912070Sbaden (let ((R1 (treeIns fn r1 nLen))) 52012070Sbaden (setq level (1+ saveLevel)) 52112070Sbaden (let ((R2 (treeIns fn r2 (diff len nLen)))) 52212070Sbaden (setq level saveLevel) 52312070Sbaden (funcall fn `(,R1 ,R2))))))) 524