1*12070Sbaden (setq SCCS-primFp.l "@(#)primFp.l 1.1 04/27/83") 2*12070Sbaden ; FP interpreter/compiler 3*12070Sbaden ; Copyright (c) 1982 Scott B. Baden 4*12070Sbaden ; Berkeley, California 5*12070Sbaden 6*12070Sbaden (include specials.l) 7*12070Sbaden (declare (special y_l z_l) 8*12070Sbaden (localf ok_pair ok_eqpair rpair$ lpair$ trnspz allNulls 9*12070Sbaden emptyHeader treeInsWithLen)) 10*12070Sbaden 11*12070Sbaden ; fp addition 12*12070Sbaden 13*12070Sbaden (defun plus$fp (x) 14*12070Sbaden (cond (DynTraceFlg (IncrTimes 'plus$fp))) 15*12070Sbaden (cond ((ok_pair x 'numberp) (plus (car x) (cadr x))) 16*12070Sbaden (t (bottom)))) 17*12070Sbaden 18*12070Sbaden ; unit function 19*12070Sbaden 20*12070Sbaden (defun (u-fnc plus$fp) nil 21*12070Sbaden 0) 22*12070Sbaden 23*12070Sbaden ; fp subtraction 24*12070Sbaden 25*12070Sbaden (defun sub$fp (x) 26*12070Sbaden (cond (DynTraceFlg (IncrTimes 'sub$fp))) 27*12070Sbaden (cond ((ok_pair x 'numberp) (diff (car x) (cadr x))) 28*12070Sbaden (t (bottom)))) 29*12070Sbaden 30*12070Sbaden 31*12070Sbaden ; unit function 32*12070Sbaden 33*12070Sbaden (defun (u-fnc sub$fp) nil 34*12070Sbaden 0) 35*12070Sbaden 36*12070Sbaden ; fp multiplication 37*12070Sbaden 38*12070Sbaden (defun times$fp (x) 39*12070Sbaden (cond (DynTraceFlg (IncrTimes 'times$fp))) 40*12070Sbaden (cond ((ok_pair x 'numberp) (product (car x) (cadr x))) 41*12070Sbaden (t (bottom)))) 42*12070Sbaden 43*12070Sbaden ; unit function 44*12070Sbaden 45*12070Sbaden (defun (u-fnc times$fp) nil 46*12070Sbaden 1) 47*12070Sbaden 48*12070Sbaden 49*12070Sbaden ; fp division 50*12070Sbaden 51*12070Sbaden (defun div$fp (x) 52*12070Sbaden (cond (DynTraceFlg (IncrTimes 'div$fp))) 53*12070Sbaden (cond ((ok_pair x 'numberp) 54*12070Sbaden (cond ((not (zerop (cadr x))) 55*12070Sbaden (quotient (car x) (cadr x))) 56*12070Sbaden (t (bottom)))) 57*12070Sbaden (t (bottom)))) 58*12070Sbaden 59*12070Sbaden ; unit function 60*12070Sbaden 61*12070Sbaden (defun (u-fnc div$fp) nil 62*12070Sbaden 1) 63*12070Sbaden 64*12070Sbaden 65*12070Sbaden 66*12070Sbaden ; logical functions, and or xor not 67*12070Sbaden 68*12070Sbaden (defun and$fp (x) 69*12070Sbaden (cond (DynTraceFlg (IncrTimes 'and$fp))) 70*12070Sbaden (cond ((ok_pair x 'boolp) 71*12070Sbaden (cond 72*12070Sbaden ((eq 'F (car x)) 'F) 73*12070Sbaden (t (cadr x)))) 74*12070Sbaden (t (bottom)))) 75*12070Sbaden 76*12070Sbaden ; unit function 77*12070Sbaden 78*12070Sbaden (defun (u-fnc and$fp) nil 79*12070Sbaden 'T) 80*12070Sbaden 81*12070Sbaden 82*12070Sbaden (defun or$fp (x) 83*12070Sbaden (cond (DynTraceFlg (IncrTimes 'or$fp))) 84*12070Sbaden (cond ((ok_pair x 'boolp) 85*12070Sbaden (cond 86*12070Sbaden ((eq 'T (car x)) 'T) 87*12070Sbaden (t (cadr x)))) 88*12070Sbaden (t (bottom)))) 89*12070Sbaden 90*12070Sbaden ; unit function 91*12070Sbaden 92*12070Sbaden (defun (u-fnc or$fp) nil 93*12070Sbaden 'F) 94*12070Sbaden 95*12070Sbaden 96*12070Sbaden (defun xor$fp (x) 97*12070Sbaden (cond (DynTraceFlg (IncrTimes 'xor$fp))) 98*12070Sbaden (cond ((ok_pair x 'boolp) 99*12070Sbaden (let ((p (car x)) 100*12070Sbaden (q (cadr x))) 101*12070Sbaden (cond ((or (and (eq p 'T) (eq q 'T)) 102*12070Sbaden (and (eq p 'F) (eq q 'F))) 103*12070Sbaden 'F) 104*12070Sbaden (t 'T)))) 105*12070Sbaden (t (bottom)))) 106*12070Sbaden 107*12070Sbaden ; unit function 108*12070Sbaden 109*12070Sbaden (defun (u-fnc xor$fp) nil 110*12070Sbaden 'F) 111*12070Sbaden 112*12070Sbaden 113*12070Sbaden (defun not$fp (x) 114*12070Sbaden (cond (DynTraceFlg (IncrTimes 'not$fp))) 115*12070Sbaden (cond ((not (atom x)) (bottom)) 116*12070Sbaden ((boolp x) (cond ((eq x 'T) 'F) (t 'T))) 117*12070Sbaden (t (bottom)))) 118*12070Sbaden 119*12070Sbaden 120*12070Sbaden ; relational operators, < <= = >= > ~= 121*12070Sbaden 122*12070Sbaden (defun lt$fp (x) 123*12070Sbaden (cond (DynTraceFlg (IncrTimes 'lt$fp))) 124*12070Sbaden (cond ((ok_pair x 'numberp) 125*12070Sbaden (cond ((lessp (car x) (cadr x)) 'T) 126*12070Sbaden (t 'F))) 127*12070Sbaden (t (bottom)))) 128*12070Sbaden 129*12070Sbaden (defun le$fp (x) 130*12070Sbaden (cond (DynTraceFlg (IncrTimes 'le$fp))) 131*12070Sbaden (cond ((ok_pair x 'numberp) 132*12070Sbaden (cond ((not (greaterp (car x) (cadr x))) 'T) 133*12070Sbaden (t 'F))) 134*12070Sbaden (t (bottom)))) 135*12070Sbaden 136*12070Sbaden (defun eq$fp (x) 137*12070Sbaden (cond (DynTraceFlg (IncrTimes 'eq$fp))) 138*12070Sbaden (cond ((ok_eqpair x ) 139*12070Sbaden (cond ((equal (car x) (cadr x)) 'T) 140*12070Sbaden (t 'F))) 141*12070Sbaden (t (bottom)))) 142*12070Sbaden 143*12070Sbaden (defun ge$fp (x) 144*12070Sbaden (cond (DynTraceFlg (IncrTimes 'ge$fp))) 145*12070Sbaden (cond ((ok_pair x 'numberp) 146*12070Sbaden (cond ((not (lessp (car x) (cadr x))) 'T) 147*12070Sbaden (t 'F))) 148*12070Sbaden (t (bottom)))) 149*12070Sbaden 150*12070Sbaden (defun gt$fp (x) 151*12070Sbaden (cond (DynTraceFlg (IncrTimes 'gt$fp))) 152*12070Sbaden (cond ((ok_pair x 'numberp) 153*12070Sbaden (cond ((greaterp (car x) (cadr x)) 'T) 154*12070Sbaden (t 'F))) 155*12070Sbaden (t (bottom)))) 156*12070Sbaden 157*12070Sbaden (defun ne$fp (x) 158*12070Sbaden (cond (DynTraceFlg (IncrTimes 'ne$fp))) 159*12070Sbaden (cond ((ok_eqpair x) 160*12070Sbaden (cond ((not (equal (car x) (cadr x))) 'T) 161*12070Sbaden (t 'F))) 162*12070Sbaden (t (bottom)))) 163*12070Sbaden 164*12070Sbaden 165*12070Sbaden 166*12070Sbaden ; check arguments for eq and ne 167*12070Sbaden 168*12070Sbaden (defun ok_eqpair (x) 169*12070Sbaden (cond ((not (atom x)) 170*12070Sbaden (cond ((eq (length x) 2) t))))) 171*12070Sbaden 172*12070Sbaden ; check arguments for binary arithmetics/logicals 173*12070Sbaden 174*12070Sbaden (defun ok_pair (x typ) 175*12070Sbaden (cond ((not (atom x)) 176*12070Sbaden (cond ((eq (length x) 2) 177*12070Sbaden (cond 178*12070Sbaden ((and (atom (car x)) (atom (cadr x))) 179*12070Sbaden (cond ((and (funcall typ (car x)) 180*12070Sbaden (funcall typ (cadr x))) t))))))))) 181*12070Sbaden 182*12070Sbaden ; check if a variable is boolean, 'T' or 'F' 183*12070Sbaden 184*12070Sbaden (defun boolp (x) 185*12070Sbaden (memq x '(T F))) 186*12070Sbaden 187*12070Sbaden 188*12070Sbaden (defun undefp (x) 189*12070Sbaden (eq x '?)) 190*12070Sbaden 191*12070Sbaden (defun tl$fp (x) 192*12070Sbaden (cond (DynTraceFlg (IncrSize 'tl$fp (size x)) (IncrTimes 'tl$fp))) 193*12070Sbaden (cond ((atom x) (bottom)) 194*12070Sbaden (t (cdr x)))) 195*12070Sbaden 196*12070Sbaden 197*12070Sbaden (defun tlr$fp (x) 198*12070Sbaden (cond (DynTraceFlg (IncrSize 'tlr$fp (size x)) (IncrTimes 'tlr$fp))) 199*12070Sbaden (cond ((listp x) (cond 200*12070Sbaden ((onep (length x)) nil) 201*12070Sbaden (t (reverse (cdr (reverse x)))))) 202*12070Sbaden (t (bottom)))) 203*12070Sbaden 204*12070Sbaden ; this function is just like id$fp execept it also prints its 205*12070Sbaden ; argument on the stdout. It is meant to be used only for debuging. 206*12070Sbaden 207*12070Sbaden (defun out$fp (x) 208*12070Sbaden (fpPP x) 209*12070Sbaden (terpri) 210*12070Sbaden x) 211*12070Sbaden 212*12070Sbaden (defun id$fp (x) 213*12070Sbaden (cond (DynTraceFlg (IncrSize 'id$fp (size x)) (IncrTimes 'id$fp))) 214*12070Sbaden x) 215*12070Sbaden 216*12070Sbaden (defun atom$fp (x) 217*12070Sbaden (cond (DynTraceFlg (IncrSize 'atom$fp (size x)) (IncrTimes 'atom$fp))) 218*12070Sbaden (cond ((atom x) 'T) 219*12070Sbaden (t 'F))) 220*12070Sbaden 221*12070Sbaden (defun null$fp (x) 222*12070Sbaden (cond (DynTraceFlg (IncrSize 'null$fp (size x)) (IncrTimes 'null$fp))) 223*12070Sbaden (cond ((null x) 'T) 224*12070Sbaden (t 'F))) 225*12070Sbaden 226*12070Sbaden (defun reverse$fp (x) 227*12070Sbaden (cond (DynTraceFlg (IncrSize 'reverse$fp (size x)) (IncrTimes 'reverse$fp))) 228*12070Sbaden (cond ((null x) x) 229*12070Sbaden ((listp x) (reverse x)) 230*12070Sbaden (t (bottom)))) 231*12070Sbaden 232*12070Sbaden (defun lpair$ (x) 233*12070Sbaden (cond ((or (undefp x) (not (listp x))) nil) 234*12070Sbaden (t 235*12070Sbaden (setq y_l (car x)) 236*12070Sbaden (setq z_l (cdr x)) 237*12070Sbaden (cond ((null z_l) t) 238*12070Sbaden (t (cond ((or (not (listp z_l)) (not (onep (length z_l)))) nil) 239*12070Sbaden (t (listp (setq z_l (car z_l)))))))))) 240*12070Sbaden 241*12070Sbaden (defun rpair$ (x) 242*12070Sbaden (cond ((or (undefp x) (not (listp x))) nil) 243*12070Sbaden (t 244*12070Sbaden (setq y_l (car x)) 245*12070Sbaden (setq z_l (cdr x)) 246*12070Sbaden (cond ((null y_l) t) 247*12070Sbaden (t (cond ((not (listp y_l)) nil) 248*12070Sbaden (t (setq z_l (car z_l)) t))))))) 249*12070Sbaden 250*12070Sbaden 251*12070Sbaden (defun distl$fp (x) 252*12070Sbaden (let ((y_l nil) (z_l nil)) 253*12070Sbaden (cond ((lpair$ x) 254*12070Sbaden (cond (DynTraceFlg 255*12070Sbaden (IncrSize 'distl$fp (size z_l)) (IncrTimes 'distl$fp))) 256*12070Sbaden (mapcar '(lambda (u) (list y_l u)) z_l)) 257*12070Sbaden (t (bottom))))) 258*12070Sbaden 259*12070Sbaden (defun distr$fp (x) 260*12070Sbaden (let ((y_l nil) (z_l nil)) 261*12070Sbaden (cond ((rpair$ x) 262*12070Sbaden (cond (DynTraceFlg 263*12070Sbaden (IncrSize 'distr$fp (size y_l)) (IncrTimes 'distr$fp))) 264*12070Sbaden (mapcar '(lambda (u) (list u z_l)) y_l)) 265*12070Sbaden (t (bottom))))) 266*12070Sbaden 267*12070Sbaden 268*12070Sbaden (defun length$fp (x) 269*12070Sbaden (cond (DynTraceFlg (IncrSize 'length$fp (size x)) (IncrTimes 'length$fp))) 270*12070Sbaden (cond ((listp x) (length x)) 271*12070Sbaden (t (bottom)))) 272*12070Sbaden 273*12070Sbaden (defun apndl$fp (x) 274*12070Sbaden (cond ((and (dtpr x) (eq 2 (length x)) (listp (cadr x))) 275*12070Sbaden (cond (DynTraceFlg 276*12070Sbaden (IncrSize 'apndl$fp (size (cadr x))) (IncrTimes 'apndl$fp))) 277*12070Sbaden (cons (car x) (cadr x))) 278*12070Sbaden (t (bottom)))) 279*12070Sbaden 280*12070Sbaden 281*12070Sbaden (defun apndr$fp (x) 282*12070Sbaden (cond ((and (dtpr x) (eq 2 (length x)) (listp (car x))) 283*12070Sbaden (cond (DynTraceFlg 284*12070Sbaden (IncrSize 'apndr$fp (size (car x))) (IncrTimes 'apndr$fp))) 285*12070Sbaden (append (car x) (cdr x))) 286*12070Sbaden (t (bottom)))) 287*12070Sbaden 288*12070Sbaden 289*12070Sbaden (defun rotl$fp (x) 290*12070Sbaden (cond (DynTraceFlg (IncrSize 'rotl$fp (size x)) (IncrTimes 'rotl$fp))) 291*12070Sbaden (cond ((null x) x) 292*12070Sbaden ((listp x) (cond ((onep (length x)) x) 293*12070Sbaden (t (append (cdr x) (list (car x)))))) 294*12070Sbaden (t (bottom)))) 295*12070Sbaden 296*12070Sbaden (defun rotr$fp (x) 297*12070Sbaden (cond (DynTraceFlg (IncrSize 'rotr$fp (size x)) (IncrTimes 'rotr$fp))) 298*12070Sbaden (cond ((null x) x) 299*12070Sbaden ((listp x) (cond ((onep (length x)) x) 300*12070Sbaden (t (reverse (rotl$fp (reverse x)))))) 301*12070Sbaden (t (bottom)))) 302*12070Sbaden 303*12070Sbaden 304*12070Sbaden (defun trans$fp (x) 305*12070Sbaden (If (listp x) 306*12070Sbaden then (If (allNulls x) 307*12070Sbaden then 308*12070Sbaden (cond (DynTraceFlg 309*12070Sbaden (IncrSize 'trans$fp (size x)) 310*12070Sbaden (IncrTimes 'trans$fp))) 311*12070Sbaden nil 312*12070Sbaden 313*12070Sbaden else 314*12070Sbaden (cond (DynTraceFlg 315*12070Sbaden (IncrSize 'trans$fp 316*12070Sbaden (+ (size (car x)) 317*12070Sbaden (size (cadr x)))) (IncrTimes 'trans$fp))) 318*12070Sbaden 319*12070Sbaden (do ((a x (cdr a)) 320*12070Sbaden (f (length (car x)))) 321*12070Sbaden ((null a) (trnspz x)) 322*12070Sbaden (If (or (not (listp (car a))) (not (eq f (length (car a))))) 323*12070Sbaden then (bottom)))) 324*12070Sbaden else 325*12070Sbaden 326*12070Sbaden (bottom))) 327*12070Sbaden 328*12070Sbaden (defun allNulls (x) 329*12070Sbaden (do ((a x (cdr a))) 330*12070Sbaden ((null a) t) 331*12070Sbaden (If (car a) then (return nil)))) 332*12070Sbaden 333*12070Sbaden 334*12070Sbaden (defun trnspz (l) 335*12070Sbaden (do 336*12070Sbaden ((h (emptyHeader (length (car l)))) 337*12070Sbaden (v l (cdr v))) 338*12070Sbaden ((null v) (mapcar 'car h)) 339*12070Sbaden (mapcar #'(lambda (x y) (tconc x y)) h (car v)))) 340*12070Sbaden 341*12070Sbaden 342*12070Sbaden (defun emptyHeader (n) 343*12070Sbaden (do 344*12070Sbaden ((r nil) 345*12070Sbaden (c n (1- c))) 346*12070Sbaden ((= c 0) r) 347*12070Sbaden (setq r (cons (ncons nil) r)))) 348*12070Sbaden 349*12070Sbaden 350*12070Sbaden (defun iota$fp (x) 351*12070Sbaden (cond (DynTraceFlg (IncrTimes 'iota$fp))) 352*12070Sbaden (cond ((undefp x) x) 353*12070Sbaden ((listp x) (bottom)) 354*12070Sbaden ((not (fixp x)) (bottom)) 355*12070Sbaden ((lessp x 0) (bottom)) 356*12070Sbaden ((zerop x) nil) 357*12070Sbaden (t 358*12070Sbaden (do ((z x (1- z)) 359*12070Sbaden (rslt nil)) 360*12070Sbaden ((zerop z) rslt) 361*12070Sbaden (setq rslt (cons z rslt)))))) 362*12070Sbaden 363*12070Sbaden ; this is the stuff that was added by dorab patel to make this have 364*12070Sbaden ; the same functions as David Lahti's interpreter 365*12070Sbaden 366*12070Sbaden 367*12070Sbaden ;; Modified by SBB to accept nil as a valid input 368*12070Sbaden 369*12070Sbaden (defun last$fp (x) 370*12070Sbaden (cond (DynTraceFlg (IncrSize 'last$fp (size x)) (IncrTimes 'last$fp))) 371*12070Sbaden (cond ((null x) nil) 372*12070Sbaden ((listp x) (car (last x))) 373*12070Sbaden (t (bottom)))) 374*12070Sbaden 375*12070Sbaden ;; Added by SBB 376*12070Sbaden 377*12070Sbaden (defun first$fp (x) 378*12070Sbaden (If DynTraceFlg then (IncrSize 'first$fp (size x)) (IncrTimes 'first$fp)) 379*12070Sbaden (If (not (listp x)) then (bottom) 380*12070Sbaden else (car x))) 381*12070Sbaden 382*12070Sbaden (defun front$fp (x) 383*12070Sbaden (cond (DynTraceFlg (IncrSize 'front$fp (size x)) (IncrTimes 'front$fp))) 384*12070Sbaden (cond ((null x) (bottom)) 385*12070Sbaden ((listp x) (nreverse (cdr (nreverse x)))) 386*12070Sbaden (t (bottom)))) 387*12070Sbaden 388*12070Sbaden (defun pick$fp (sAndX) 389*12070Sbaden (let ((s (car sAndX)) 390*12070Sbaden (x (cadr sAndX))) 391*12070Sbaden (cond (DynTraceFlg (IncrSize 'pick$fp (size x)) (IncrTimes 'pick$fp))) 392*12070Sbaden 393*12070Sbaden (If (or (not (fixp s)) (zerop s)) then (bottom) 394*12070Sbaden else 395*12070Sbaden 396*12070Sbaden (progn 397*12070Sbaden (cond (DynTraceFlg 398*12070Sbaden (IncrTimes 'select$fp) 399*12070Sbaden (IncrSize 'select$fp (size x)))) 400*12070Sbaden 401*12070Sbaden (cond ((not (listp x)) (bottom)) 402*12070Sbaden ((plusp s) 403*12070Sbaden (If (greaterp s (length x)) then (bottom) 404*12070Sbaden else (nthelem s x))) 405*12070Sbaden ((minusp s) 406*12070Sbaden (let ((len (length x))) 407*12070Sbaden (If (greaterp (absval s) len) then (bottom) 408*12070Sbaden else (nthelem (plus len 1 s) x))))))))) 409*12070Sbaden 410*12070Sbaden 411*12070Sbaden 412*12070Sbaden (defun concat$fp (x) 413*12070Sbaden (cond (DynTraceFlg (IncrSize 'concat$fp (size x)) (IncrTimes 'concat$fp))) 414*12070Sbaden 415*12070Sbaden (If (listp x) 416*12070Sbaden then 417*12070Sbaden (do ((a x (cdr a)) 418*12070Sbaden (y (copy x) (cdr y)) 419*12070Sbaden (rslt (ncons nil))) 420*12070Sbaden ((null a) (car rslt)) 421*12070Sbaden (If (not (listp (car a))) then (bottom)) 422*12070Sbaden 423*12070Sbaden (lconc rslt (car y))) 424*12070Sbaden 425*12070Sbaden else (bottom))) 426*12070Sbaden 427*12070Sbaden 428*12070Sbaden (defun pair$fp (x) 429*12070Sbaden (cond (DynTraceFlg (IncrSize 'pair$fp (size x)) (IncrTimes 'pair$fp))) 430*12070Sbaden (cond ((not (listp x)) (bottom)) 431*12070Sbaden ((null x) (bottom)) 432*12070Sbaden (t (do ((count 0 (add count 2)) ; set local vars 433*12070Sbaden (max (length x)) 434*12070Sbaden (ret nil)) 435*12070Sbaden ((not (lessp count max)) (nreverse ret)) ; return ret at end 436*12070Sbaden (cond ((equal (diff max count) 1) ; if only one element left 437*12070Sbaden (setq ret (cons (list (car x)) ret))) 438*12070Sbaden (t (setq ret (cons (list (car x) (cadr x)) ret)) 439*12070Sbaden (setq x (cddr x)))))))) 440*12070Sbaden 441*12070Sbaden 442*12070Sbaden (defun split$fp (x) 443*12070Sbaden (cond (DynTraceFlg (IncrSize 'split$fp (size x)) (IncrTimes 'split$fp))) 444*12070Sbaden (cond ((not (listp x)) (bottom)) 445*12070Sbaden ((null x) (bottom)) 446*12070Sbaden ((eq (length x) 1) (list x nil)) 447*12070Sbaden (t 448*12070Sbaden (do ((count 1 (add1 count)) 449*12070Sbaden (mid (fix (plus 0.5 (quotient (length x) 2.0)))) 450*12070Sbaden (ret nil)) 451*12070Sbaden ((greaterp count mid) (cons (nreverse ret) (list x))) 452*12070Sbaden (setq ret (cons (car x) ret)) 453*12070Sbaden (setq x (cdr x)))))) 454*12070Sbaden 455*12070Sbaden 456*12070Sbaden ; Library functions: sin, asin, cos, acos, log, exp, mod 457*12070Sbaden 458*12070Sbaden (defun sin$fp (x) 459*12070Sbaden (cond (DynTraceFlg (IncrTimes 'sin$fp))) 460*12070Sbaden (cond ((numberp x) (sin x)) 461*12070Sbaden (t (bottom)))) 462*12070Sbaden 463*12070Sbaden (defun asin$fp (x) 464*12070Sbaden (cond (DynTraceFlg (IncrTimes 'asin$fp))) 465*12070Sbaden (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (asin x)) 466*12070Sbaden (t (bottom)))) 467*12070Sbaden 468*12070Sbaden (defun cos$fp (x) 469*12070Sbaden (cond (DynTraceFlg (IncrTimes 'cos$fp))) 470*12070Sbaden (cond ((numberp x) (cos x)) 471*12070Sbaden (t (bottom)))) 472*12070Sbaden 473*12070Sbaden (defun acos$fp (x) 474*12070Sbaden (cond (DynTraceFlg (IncrTimes 'acos$fp))) 475*12070Sbaden (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (acos x)) 476*12070Sbaden (t (bottom)))) 477*12070Sbaden 478*12070Sbaden (defun log$fp (x) 479*12070Sbaden (cond (DynTraceFlg (IncrTimes 'log$fp))) 480*12070Sbaden (cond ((and (numberp x) (not (minusp x))) (log x)) 481*12070Sbaden (t (bottom)))) 482*12070Sbaden 483*12070Sbaden (defun exp$fp (x) 484*12070Sbaden (cond (DynTraceFlg (IncrTimes 'exp$fp))) 485*12070Sbaden (cond ((numberp x) (exp x)) 486*12070Sbaden (t (bottom)))) 487*12070Sbaden 488*12070Sbaden (defun mod$fp (x) 489*12070Sbaden (cond (DynTraceFlg (IncrTimes 'mod$fp))) 490*12070Sbaden (cond ((ok_pair x 'numberp) (mod (car x) (cadr x))) 491*12070Sbaden (t (bottom)))) 492*12070Sbaden 493*12070Sbaden 494*12070Sbaden ;; Tree insert function 495*12070Sbaden 496*12070Sbaden 497*12070Sbaden (defun treeIns$fp (fn x) 498*12070Sbaden (If (not (listp x)) then (bottom) 499*12070Sbaden else 500*12070Sbaden (If (null x) then (unitTreeInsert fn) 501*12070Sbaden else 502*12070Sbaden (let ((len (length x))) 503*12070Sbaden (If (onep len) then (car x) 504*12070Sbaden else 505*12070Sbaden (If (twop len) then (funcall fn x ) 506*12070Sbaden else (treeInsWithLen fn x len))))))) 507*12070Sbaden 508*12070Sbaden 509*12070Sbaden (defun treeInsWithLen (fn x len) 510*12070Sbaden (let* ((r1 (copy x)) 511*12070Sbaden (nLen (fix (plus 0.5 (quotient len 2.0)))) 512*12070Sbaden (p (Cnth r1 nLen)) 513*12070Sbaden (r2 (cdr p))) 514*12070Sbaden (rplacd p nil) 515*12070Sbaden (let ((saveLevel level)) 516*12070Sbaden (setq level (1+ level)) 517*12070Sbaden (let ((R1 (treeIns fn r1 nLen))) 518*12070Sbaden (setq level (1+ saveLevel)) 519*12070Sbaden (let ((R2 (treeIns fn r2 (diff len nLen)))) 520*12070Sbaden (setq level saveLevel) 521*12070Sbaden (funcall fn `(,R1 ,R2))))))) 522