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

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)))))))

unix.superglobalmegacorp.com

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