|
|
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))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.