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