Annotation of 43BSD/ucb/fp/primFp.l, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.