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

unix.superglobalmegacorp.com

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