1*12092Sbaden (setq SCCS-primFp.l "@(#)primFp.l 1.2 04/29/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 9*12092Sbaden 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) 305*12092Sbaden (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 333*12092Sbaden (defun allLists (x) 334*12092Sbaden (do ((a x (cdr a))) 335*12092Sbaden ((null a) t) 336*12092Sbaden (If (not (dtpr (car a))) then (return nil)))) 33712070Sbaden 338*12092Sbaden 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)) 390*12092Sbaden ((listp x) (reverse (cdr (reverse x)))) 39112070Sbaden (t (bottom)))) 39212070Sbaden 39312070Sbaden (defun pick$fp (sAndX) 39412070Sbaden (let ((s (car sAndX)) 39512070Sbaden (x (cadr sAndX))) 39612070Sbaden (cond (DynTraceFlg (IncrSize 'pick$fp (size x)) (IncrTimes 'pick$fp))) 39712070Sbaden 39812070Sbaden (If (or (not (fixp s)) (zerop s)) then (bottom) 39912070Sbaden else 40012070Sbaden 40112070Sbaden (progn 40212070Sbaden (cond (DynTraceFlg 40312070Sbaden (IncrTimes 'select$fp) 40412070Sbaden (IncrSize 'select$fp (size x)))) 40512070Sbaden 40612070Sbaden (cond ((not (listp x)) (bottom)) 40712070Sbaden ((plusp s) 40812070Sbaden (If (greaterp s (length x)) then (bottom) 40912070Sbaden else (nthelem s x))) 41012070Sbaden ((minusp s) 41112070Sbaden (let ((len (length x))) 41212070Sbaden (If (greaterp (absval s) len) then (bottom) 41312070Sbaden else (nthelem (plus len 1 s) x))))))))) 41412070Sbaden 41512070Sbaden 41612070Sbaden 41712070Sbaden (defun concat$fp (x) 41812070Sbaden (cond (DynTraceFlg (IncrSize 'concat$fp (size x)) (IncrTimes 'concat$fp))) 41912070Sbaden 42012070Sbaden (If (listp x) 42112070Sbaden then 42212070Sbaden (do ((a x (cdr a)) 42312070Sbaden (y (copy x) (cdr y)) 42412070Sbaden (rslt (ncons nil))) 42512070Sbaden ((null a) (car rslt)) 42612070Sbaden (If (not (listp (car a))) then (bottom)) 42712070Sbaden 42812070Sbaden (lconc rslt (car y))) 42912070Sbaden 43012070Sbaden else (bottom))) 43112070Sbaden 43212070Sbaden 43312070Sbaden (defun pair$fp (x) 43412070Sbaden (cond (DynTraceFlg (IncrSize 'pair$fp (size x)) (IncrTimes 'pair$fp))) 435*12092Sbaden (cond ((not (listp x)) (bottom)) 436*12092Sbaden ((null x) (bottom)) 437*12092Sbaden (t (do ((count 0 (add count 2)) ; set local vars 438*12092Sbaden (max (length x)) 439*12092Sbaden (ret (ncons nil))) 440*12092Sbaden ((not (lessp count max)) (car ret)) ; return car of tconc struc 441*12092Sbaden (cond ((equal (diff max count) 1) ; if only one element left 442*12092Sbaden (tconc ret (list (car x)))) 443*12092Sbaden (t (tconc ret (list (car x) (cadr x))) 444*12092Sbaden (setq x (cddr x)))))))) 44512070Sbaden 44612070Sbaden 44712070Sbaden (defun split$fp (x) 44812070Sbaden (cond (DynTraceFlg (IncrSize 'split$fp (size x)) (IncrTimes 'split$fp))) 44912070Sbaden (cond ((not (listp x)) (bottom)) 45012070Sbaden ((null x) (bottom)) 45112070Sbaden ((eq (length x) 1) (list x nil)) 45212070Sbaden (t 45312070Sbaden (do ((count 1 (add1 count)) 45412070Sbaden (mid (fix (plus 0.5 (quotient (length x) 2.0)))) 45512070Sbaden (ret nil)) 45612070Sbaden ((greaterp count mid) (cons (nreverse ret) (list x))) 45712070Sbaden (setq ret (cons (car x) ret)) 45812070Sbaden (setq x (cdr x)))))) 45912070Sbaden 46012070Sbaden 46112070Sbaden ; Library functions: sin, asin, cos, acos, log, exp, mod 46212070Sbaden 46312070Sbaden (defun sin$fp (x) 46412070Sbaden (cond (DynTraceFlg (IncrTimes 'sin$fp))) 46512070Sbaden (cond ((numberp x) (sin x)) 46612070Sbaden (t (bottom)))) 46712070Sbaden 46812070Sbaden (defun asin$fp (x) 46912070Sbaden (cond (DynTraceFlg (IncrTimes 'asin$fp))) 47012070Sbaden (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (asin x)) 47112070Sbaden (t (bottom)))) 47212070Sbaden 47312070Sbaden (defun cos$fp (x) 47412070Sbaden (cond (DynTraceFlg (IncrTimes 'cos$fp))) 47512070Sbaden (cond ((numberp x) (cos x)) 47612070Sbaden (t (bottom)))) 47712070Sbaden 47812070Sbaden (defun acos$fp (x) 47912070Sbaden (cond (DynTraceFlg (IncrTimes 'acos$fp))) 48012070Sbaden (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (acos x)) 48112070Sbaden (t (bottom)))) 48212070Sbaden 48312070Sbaden (defun log$fp (x) 48412070Sbaden (cond (DynTraceFlg (IncrTimes 'log$fp))) 48512070Sbaden (cond ((and (numberp x) (not (minusp x))) (log x)) 48612070Sbaden (t (bottom)))) 48712070Sbaden 48812070Sbaden (defun exp$fp (x) 48912070Sbaden (cond (DynTraceFlg (IncrTimes 'exp$fp))) 49012070Sbaden (cond ((numberp x) (exp x)) 49112070Sbaden (t (bottom)))) 49212070Sbaden 49312070Sbaden (defun mod$fp (x) 49412070Sbaden (cond (DynTraceFlg (IncrTimes 'mod$fp))) 49512070Sbaden (cond ((ok_pair x 'numberp) (mod (car x) (cadr x))) 49612070Sbaden (t (bottom)))) 49712070Sbaden 49812070Sbaden 49912070Sbaden ;; Tree insert function 50012070Sbaden 50112070Sbaden 50212070Sbaden (defun treeIns$fp (fn x) 50312070Sbaden (If (not (listp x)) then (bottom) 50412070Sbaden else 50512070Sbaden (If (null x) then (unitTreeInsert fn) 50612070Sbaden else 50712070Sbaden (let ((len (length x))) 50812070Sbaden (If (onep len) then (car x) 50912070Sbaden else 51012070Sbaden (If (twop len) then (funcall fn x ) 51112070Sbaden else (treeInsWithLen fn x len))))))) 51212070Sbaden 51312070Sbaden 51412070Sbaden (defun treeInsWithLen (fn x len) 51512070Sbaden (let* ((r1 (copy x)) 51612070Sbaden (nLen (fix (plus 0.5 (quotient len 2.0)))) 51712070Sbaden (p (Cnth r1 nLen)) 51812070Sbaden (r2 (cdr p))) 51912070Sbaden (rplacd p nil) 52012070Sbaden (let ((saveLevel level)) 52112070Sbaden (setq level (1+ level)) 52212070Sbaden (let ((R1 (treeIns fn r1 nLen))) 52312070Sbaden (setq level (1+ saveLevel)) 52412070Sbaden (let ((R2 (treeIns fn r2 (diff len nLen)))) 52512070Sbaden (setq level saveLevel) 52612070Sbaden (funcall fn `(,R1 ,R2))))))) 527