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