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

1.1       root        1: (setq SCCS-codeGen.l "@(#)codeGen.l    1.1     4/27/83")
                      2: ;  FP interpreter/compiler
                      3: ;  Copyright (c) 1982  Scott B. Baden
                      4: ;  Berkeley, California
                      5: 
                      6: ; Main Routine to do code generation
                      7: 
                      8: (include specials.l)
                      9: (declare 
                     10:   (localf build_constr mName condit$fp alpha$fp insert$fp ti$fp while$fp)
                     11:   )
                     12: 
                     13: (defmacro getFform (xx)
                     14:   `(implode (nreverse `(p f ,@(cdr (nreverse (explodec (cxr 0 ,xx))))))))
                     15: 
                     16: (defun mName (name)
                     17:   (cond ((atom name) `',name)
                     18:        (t `',(getFform name))))
                     19: 
                     20: (defun mNameI (name)
                     21:   (cond ((atom name) name)
                     22:        (t (getFform name))))
                     23: 
                     24: (defun codeGen (ptree)
                     25:   (cond ((atom ptree) `',ptree)                ; primitive or
                     26:                                                        ; user defined
                     27:        
                     28:        ((eq (cxr 0 ptree) 'alpha$$)                    ; apply to all
                     29:         (alpha$fp (cxr 1 ptree)))
                     30:        
                     31:        ((eq (cxr 0 ptree) 'insert$$)                   ; insert
                     32:         (insert$fp (cxr 1 ptree)))
                     33:        
                     34:        ((eq (cxr 0 ptree) 'ti$$)                       ; tree insert
                     35:         (ti$fp (cxr 1 ptree)))
                     36:        
                     37:        ((eq (cxr 0 ptree) 'select$$)                   ; selector
                     38:         (let ((sel (cxr 1 ptree)))
                     39:              
                     40:              (If (zerop sel)           ; No stats for errors
                     41:                  then `#'(lambda (x) (bottom))
                     42:                  
                     43:                  else
                     44:                  
                     45:                  `#'(lambda (x)
                     46:                             (cond ((not (listp x)) (bottom)))
                     47:                             (cond (DynTraceFlg (measSel ,sel x)))
                     48:                             ,(cond ((plusp sel)
                     49:                                     `(If (greaterp ,sel (length x))
                     50:                                          then (bottom)
                     51:                                          else (nthelem ,sel x)))
                     52:                                    
                     53:                                    
                     54:                                    ((minusp sel)
                     55:                                     `(let  ((len (length x)))
                     56:                                            (If (greaterp ,(absval sel) len) 
                     57:                                                then (bottom)
                     58:                                                else (nthelem (plus len ,(1+ sel)) x)))))))))
                     59: 
                     60: 
                     61:        
                     62:        ((eq (cxr 0 ptree) 'constant$$)                 ; constant
                     63:         (let ((const (cxr 1 ptree)))
                     64:              (If (eq const '?)
                     65:                  then `#'(lambda (x) (bottom))
                     66:                  
                     67:                  else
                     68:                  
                     69:                  `#'(lambda (x) 
                     70:                             (cond (DynTraceFlg (measCons ,const x)))
                     71:                             ,const))))
                     72: 
                     73: 
                     74: 
                     75:        ((eq (cxr 0 ptree) 'condit$$)                   ; conditional
                     76:         (condit$fp (cxr 1 ptree) (cxr 2 ptree) (cxr 3 ptree)))
                     77:        
                     78:        ((eq (cxr 0 ptree) 'while$$)                    ; while
                     79:         (while$fp (cxr 1 ptree) (cxr 2 ptree)))
                     80:        
                     81:        
                     82:        ((eq (cxr 0 ptree) 'compos$$)                   ; composition
                     83:         (let ((cm1 (cxr 1 ptree))
                     84:               (cm2 (cxr 2 ptree)))
                     85:              `#'(lambda (x) 
                     86:                         (cond (DynTraceFlg
                     87:                                (measComp ,(mName cm1) ,(mName cm2) x)))
                     88:                         (funcall ,(codeGen cm1)
                     89:                                  (funcall ,(codeGen cm2)
                     90:                                           x)))))
                     91: 
                     92:        
                     93:        ((eq (cxr 0 ptree) 'constr$$)
                     94:         (build_constr ptree))                          ; construction
                     95:        
                     96:        (t 'error)))                                    ; error, sb '?
                     97: 
                     98: 
                     99: ; build up the list of arguments for a construction
                    100: 
                    101: (defun build_constr (pt)
                    102:   (cond ((and (eq 2 (hunksize pt)) (null (cxr 1 pt)))
                    103:         `#'(lambda (x) (cond (DynTraceFlg (measCons nil x)))  nil))
                    104:        (t
                    105:         (do ((i 2 (1+ i))
                    106:              (stat (list `,(mNameI (cxr 1 pt))))
                    107:              (con (list (codeGen (cxr 1 pt)))))
                    108:             ((greaterp i (1- (hunksize pt))) 
                    109:              (return
                    110:               (funcall 'constr$fp con stat)))
                    111:             (setq stat (append stat (list `,(mNameI (cxr i pt)))))
                    112:             (setq con (append con (list (codeGen (cxr i pt)))))))))
                    113: 
                    114: 
                    115: ; generate a lisp function definition from an FP parse tree
                    116: 
                    117: (defun put_fn (fn_name p_tree)
                    118:   (untraceDel (extName fn_name))
                    119:   (putd fn_name 
                    120:        `(lambda (x) 
                    121:                 (cond (DynTraceFlg (IncrUDF ',fn_name x)))
                    122:                 (funcall ,(codeGen p_tree) x))))
                    123: 
                    124: 
                    125: ; The Functional forms
                    126: ;
                    127: 
                    128: 
                    129: ; fp conditional
                    130: 
                    131: (def condit$fp
                    132:   (lambda (Pptree Tptree Fptree)
                    133:          (let ((test (codeGen Pptree))
                    134:                (true (codeGen Tptree))
                    135:                (false (codeGen Fptree)))
                    136:               
                    137:               (let ((q
                    138:                      `(lambda (x)
                    139:                                (cond (DynTraceFlg
                    140:                                       (measCond 
                    141:                                        ,(mName Pptree)
                    142:                                        ,(mName Tptree)
                    143:                                        ,(mName Fptree) x)))
                    144: 
                    145:                                (let ((z (funcall ,test x)))
                    146:                                     (cond 
                    147:                                      ((eq 'T z) (funcall ,true x))
                    148:                                      ((eq 'F z) (funcall ,false x))
                    149:                                      (t (bottom)))))))
                    150:                    `(function ,q)))))
                    151: 
                    152: 
                    153: 
                    154: ; construction 
                    155: 
                    156: (def constr$fp 
                    157:   (lexpr (v)
                    158:         (let* ((vl (listify v))
                    159:                (q
                    160:                 `(lambda (x)
                    161:                          (cond (DynTraceFlg
                    162:                                 (measConstr ',(cadr vl) x)))
                    163:                          (let* ((savelevel level)
                    164:                                 (h 
                    165:                                  (list  
                    166:                                   ,@(mapcar 
                    167:                                      #'(lambda 
                    168:                                         (y)
                    169:                                         `(let ((r ,`(funcall ,y x)))
                    170:                                               (setq level savelevel)
                    171:                                               r))
                    172:                                      (car vl)))))
                    173:                                (setq level savelevel)
                    174:                                h
                    175:                                ))))
                    176:               `(function ,q))))
                    177: 
                    178: 
                    179: 
                    180: 
                    181: ; apply to all
                    182: 
                    183: (def alpha$fp
                    184:   (lambda (ptree)
                    185:          (let* ((fn (codeGen ptree))
                    186:                 (q
                    187:                  `(lambda (x)
                    188:                           (cond (DynTraceFlg
                    189:                                  (measAlph ,(mName ptree) x)))
                    190:                           (cond ((null x) nil)
                    191:                                 ((not (listp x)) (bottom))
                    192:                                 (t 
                    193:                                  (let* ((savelevel level)
                    194:                                         (h
                    195:                                          (mapcar 
                    196:                                           '(lambda (y)
                    197:                                                    (setq level savelevel)
                    198:                                                    (funcall ,fn y))
                    199:                                           x)))
                    200:                                        
                    201:                                        (setq level savelevel)
                    202:                                        h))))))
                    203:                `(function ,q))))
                    204: 
                    205: 
                    206: ; insert
                    207: 
                    208: (def insert$fp
                    209:   (lambda (ptree)
                    210:          (let* ((fn (codeGen ptree))
                    211:                 (q
                    212:                  `(lambda (x)
                    213:                           (cond (DynTraceFlg (measIns ,(mName ptree) x)))
                    214:                           (cond ((not (listp x)) (bottom))
                    215:                                 ((null x) 
                    216:                                  (let ((ufn (get 'u-fnc ,fn)))
                    217:                                       (cond 
                    218:                                        (ufn (funcall ufn))
                    219:                                        (t (bottom)))))
                    220:                                 (t (let ((v (reverse x)) (z nil))
                    221:                                         (setq z (car v))
                    222:                                         (setq v (cdr v))
                    223:                                         (mapc '(lambda (y) (setq z (funcall ,fn (list y z)))) v)
                    224:                                         z))))))
                    225:                `(function ,q))))
                    226: 
                    227: 
                    228: 
                    229: 
                    230: (defun while$fp (pFn fFn)
                    231:   (let* ((fn_p (codeGen pFn))
                    232:         (fn_f (codeGen fFn))
                    233:         (q
                    234:          `(lambda (x)
                    235:                   (cond (DynTraceFlg
                    236:                          (measWhile ,(mName pFn) ,(mName fFn) x)))
                    237:                   (do
                    238:                    ((z (funcall ,fn_p x) (funcall ,fn_p rslt))
                    239:                     (rslt x))
                    240:                    ((eq 'F z) rslt)
                    241:                    (cond ((undefp z) (bottom)))
                    242:                    (setq rslt (funcall ,fn_f rslt))))))
                    243:        `(function ,q)))
                    244: 
                    245: 
                    246: 
                    247: 
                    248: ; Tree insert
                    249: 
                    250: (def ti$fp
                    251:   (lambda (ptree)
                    252:          (let* ((fn (codeGen ptree))
                    253:                 (q
                    254:                  `(lambda (x)
                    255:                           (cond (DynTraceFlg (measAi ,(mName ptree) x)))
                    256:                           (treeIns$fp ,fn x))))
                    257:                `(function ,q))))

unix.superglobalmegacorp.com

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