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