|
|
1.1 ! root 1: (setq SCCS-fpMain.l "@(#)fpMain.l 1.2 10/8/83") ! 2: ; FP interpreter/compiler ! 3: ; Copyright (c) 1982 Scott B. Baden ! 4: ; Berkeley, California ! 5: ! 6: ; Main routine to start up FP ! 7: ! 8: (include specials.l) ! 9: (declare (special arg parse_tree) ! 10: (localf syntaxErr synErrMsg last_cr p_indic display rtime doExit) ! 11: ) ! 12: ! 13: ; may ask for debug output, ! 14: ; specifiy character set, only ASCII (asc) supported at this time. ! 15: ; exit to shell if invoked from it. ! 16: ! 17: (defun fpMain (debug from_shell) ! 18: ! 19: (do ((arg nil) ! 20: (parse_tree (*catch '(parse$err end_condit end_while) (parse 'top_lev)) ! 21: (*catch '(parse$err end_condit end_while) (parse 'top_lev)))) ! 22: ! 23: ; exit if an EOF has been entered from the terminal ! 24: ; (and it was the only character entered on the line) ! 25: ! 26: ((and (eq parse_tree 'eof$$) (null infile)) ! 27: (terpri) ! 28: (doExit from_shell)) ; in any case exit ! 29: ! 30: ; if the EOF was from a file close it and then accept ! 31: ; input from terminal again ! 32: ! 33: (cond ! 34: ((not (eq parse_tree 'eof$$)) ! 35: (cond (debug (print parse_tree) ! 36: (terpri))) ! 37: (cond ! 38: ((not (eq parse_tree 'cmd$$)) ! 39: (cond ! 40: ((not (listp parse_tree)) ! 41: (let ! 42: ((defn (put_fn fn_name parse_tree))) ; define the function ! 43: (cond (in_def ! 44: (patom "{") ! 45: (patom (setq usr_fn_name ! 46: (implode ! 47: (nreverse (cdddr (nreverse (explode fn_name))))))) ! 48: (patom "}") (terpri) ! 49: (putprop 'sources in_buf usr_fn_name))) ! 50: (cond ((and debug in_def) (pp fn_name)))) ! 51: ! 52: ; read in an FP sequence once a colon (apply) has been detected ! 53: ! 54: (cond ((not in_def) ! 55: (cond ((and (null infile) ptport) ! 56: (do ! 57: ((c (tyipeek) (tyipeek))) ! 58: ((or (null (memq c #.whiteSpace)))) ! 59: (Tyi)))) ! 60: (setq arg (*catch 'parse$err (get_obj nil))) ! 61: ! 62: (cond ((find 'err$$ arg) ! 63: (syntaxErr)) ! 64: ((undefp arg) ! 65: (terpri) (patom '?) (terpri)) ! 66: (t ! 67: (let ((sPlist ! 68: (If DynTraceFlg then ! 69: (copy (plist 'Measures)) else nil)) ! 70: (wcTime1 (sys:time)) ! 71: (time1 (ptime)) ! 72: (rslt (*catch 'bottom$up (funcall fn_name arg))) ! 73: (time2 (ptime)) ! 74: (wcTime2 (sys:time))) ! 75: ! 76: (fpPP rslt) ! 77: ! 78: (If (and DynTraceFlg (undefp rslt)) then (setplist 'Measures sPlist)) ! 79: (cond (timeIt ! 80: (let ((gcTime (diff (cadr time2) (cadr time1)))) ! 81: (msg N "cpu + gc [wc] = ") ! 82: (rtime (diff (diff (car time2) (car time1)) gcTime) 60.0) ! 83: (patom " + ") ! 84: (rtime gcTime 60.0) ! 85: (patom " [") ! 86: (rtime (diff wcTime2 wcTime1) 1.0) ! 87: (msg "]")) ! 88: (msg (N 2)))))))))) ! 89: ! 90: (t (syntaxErr) )))))) ! 91: ! 92: ! 93: (cond (in_def (setq fn_name 'tmp$$))) ! 94: ! 95: (cond ((and infile (eq parse_tree 'eof$$)) ! 96: (patom " ") (close infile) (setq infile nil)) ! 97: ! 98: (t (cond ((and (null infile) (not (eq parse_tree 'eof$$))) ! 99: (patom " "))))) ! 100: ! 101: (setq level 0) ! 102: (setq in_buf nil) ! 103: (setq in_def nil))) ! 104: ! 105: ! 106: ; Display a LISP list as an equivalent FP sequence ! 107: ! 108: (defun display (obj) ! 109: (cond ((null obj) (patom "<>")) ! 110: ((atom obj) (patom obj)) ! 111: ((listp obj) ! 112: (patom "<") ! 113: (maplist ! 114: '(lambda (x) ! 115: (display (car x)) ! 116: (cond ((not (onep (length x))) (patom " ")))) obj) ! 117: (patom ">")))) ! 118: ! 119: ; Form a character string of a LISP list as an equivalent FP sequence ! 120: ! 121: (defun put_obj (obj) ! 122: (cond ((null obj) "<>") ! 123: ((atom obj) obj) ! 124: ((listp obj) ! 125: (cond ((onep (length obj)) ! 126: (concat "<" (put_obj (car obj)) ">")) ! 127: (t (do ! 128: ((xx obj (cdr xx)) ! 129: (zz t nil) ! 130: (yy "<")) ! 131: ((zerop (length xx)) (concat yy ">")) ! 132: (cond ((not zz) (setq yy (concat yy " ")))) ! 133: (setq yy (concat yy (put_obj (car xx)))))))))) ! 134: ! 135: ! 136: ! 137: (defun rtime (time scale) ! 138: (patom (quotient (float (fix (product 100 (quotient time scale)))) ! 139: 100.0))) ! 140: ! 141: (defun doExit (exitCond) ! 142: (cond (exitCond ! 143: (dontLoseStats) ! 144: (and (portp 'traceport) (close traceport)) ; if traceport is open ! 145: (and ptport (close ptport)) ; if script port is open ! 146: (exit)))) ! 147: ! 148: ! 149: (defun syntaxErr nil ! 150: (let ((piport infile) ! 151: (tbuf (ncons nil))) ! 152: (cond ((and in_def (eq #/} (car in_buf))) ! 153: (do ((c (Tyi) (Tyi))) ! 154: ((memq c '(-1 #.CR)))) ! 155: (synErrMsg) ! 156: (p_indic) ! 157: ) ! 158: ! 159: (t (cond (in_def ! 160: (cond ((and ! 161: (eq #.CR ! 162: (do ((c (tyipeek) (tyipeek)) ! 163: (e nil)) ! 164: ((memq c '(-1 #/} #.CR)) ! 165: (If (eq c #/}) then ! 166: (progn ! 167: (tconc tbuf c) ! 168: (setq e (Tyi))) ! 169: ! 170: else ! 171: ! 172: (If (eq c #.CR) then ! 173: (setq e (Tyi)))) ! 174: ! 175: (synErrMsg) ! 176: (mapcar 'p_strng (car tbuf)) ! 177: (p_indic) ! 178: e) ! 179: (tconc tbuf (Tyi)))) ! 180: infile) ! 181: ! 182: (do ((c (tyipeek) (tyipeek)) ! 183: (tbuf (ncons nil))) ! 184: ((memq c '(-1 #/})) ! 185: (If (eq c #/}) ! 186: then (tconc tbuf (Tyi))) ! 187: (mapcar 'p_strng (car tbuf)) ! 188: (terpri) ! 189: (If (eq c #/}) then ! 190: (do ((c (Tyi) (Tyi))) ! 191: ((memq c '(-1 #.CR))))) ! 192: ) ! 193: ! 194: (tconc tbuf (Tyi)))))) ! 195: ! 196: (t ! 197: (do ((c (tyipeek) (tyipeek))) ! 198: ((memq c '(-1 #.CR)) ! 199: (Tyi) ! 200: (synErrMsg) ! 201: (mapcar 'p_strng (car tbuf)) ! 202: (p_indic)) ! 203: (tconc tbuf (Tyi))))))) ! 204: )) ! 205: ! 206: (defun synErrMsg nil ! 207: (msg N "Syntax Error:" ! 208: (N 2)) ! 209: (mapcar 'p_strng (reverse in_buf))) ! 210: ! 211: ! 212: (defun p_indic nil ! 213: (msg N (B (length (cdr (last_cr (reverse in_buf))))) "^" N) ! 214: (If (null infile) then (terpr))) ! 215: ! 216: (defun last_cr (zy) ! 217: (cond ((null (memq #.CR zy)) zy) (t (last_cr (cdr (memq #.CR zy)))))) ! 218: ! 219: ; throw bottom to the next level ! 220: ; This shortens the compiled code ! 221: ! 222: (defun bottom nil ! 223: (*throw 'bottom$up '?))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.