1*12071Sbaden (setq SCCS-runFp.l "@(#)runFp.l 1.1 04/27/83") 2*12071Sbaden ; FP interpreter/compiler 3*12071Sbaden ; Copyright (c) 1982 Scott B. Baden 4*12071Sbaden ; Berkeley, California 5*12071Sbaden 6*12071Sbaden ; FASL (or load if no object files exist) then run FP. 7*12071Sbaden ; also set up user-top-level to 'runFp'. 8*12071Sbaden 9*12071Sbaden (include specials.l) 10*12071Sbaden 11*12071Sbaden (declare 12*12071Sbaden (localf make_chset setup init addHelp initHelp) 13*12071Sbaden (special user-top-level)) 14*12071Sbaden 15*12071Sbaden (sstatus translink on) 16*12071Sbaden 17*12071Sbaden (mapcar 'load 18*12071Sbaden '(fpMain handlers scanner parser codeGen primFp utils fpPP fpMeasures)) 19*12071Sbaden 20*12071Sbaden 21*12071Sbaden (defun runFp nil 22*12071Sbaden (cond ((null (make_chset)) 23*12071Sbaden (patom "Illegal Character set") 24*12071Sbaden (terpri) 25*12071Sbaden (exit)) 26*12071Sbaden 27*12071Sbaden (t 28*12071Sbaden (setup) ; set up FP syntax funnies 29*12071Sbaden (init) 30*12071Sbaden (Tyi) 31*12071Sbaden (msg N "FP, v. 4.2, (4/27/83)" N (B 6)))) 32*12071Sbaden 33*12071Sbaden (setq user-top-level 'res_fp) ; from now on just resume FP-- 34*12071Sbaden ; no need for extensive initializations 35*12071Sbaden 36*12071Sbaden (signal 2 'break-resp) 37*12071Sbaden (fpMain nil t)) ; invoke fp, exit to shell when done 38*12071Sbaden 39*12071Sbaden (defun res_fp nil ; restart fp after infinite recursion, 40*12071Sbaden ; simpler initializatin than runFp. 41*12071Sbaden (signal 2 'break-resp) 42*12071Sbaden (msg N (B 6)) 43*12071Sbaden (setq in_def nil infile nil outfile nil fn_name 'tmp$$ in_buf nil) 44*12071Sbaden (setq level 0) 45*12071Sbaden (fpMain nil t)) 46*12071Sbaden 47*12071Sbaden 48*12071Sbaden (defun make_chset nil 49*12071Sbaden (putprop 'fonts "+-,>!%&*/:=@{}()[]?~TF;#" 'asc) 50*12071Sbaden (cond ((null (setq rsrvd (get 'fonts char_set)))) 51*12071Sbaden (t (setq e_rsrvd (explodec rsrvd))))) 52*12071Sbaden 53*12071Sbaden 54*12071Sbaden (defun setup nil 55*12071Sbaden (setq newreadtable (makereadtable nil)) 56*12071Sbaden (let ((readtable newreadtable)) 57*12071Sbaden (mapcar '(lambda (z) (setsyntax z 66)) (exploden rsrvd)) 58*12071Sbaden (setsyntax #/< 'macro 'readit)) 59*12071Sbaden 60*12071Sbaden (setsyntax #/< 'macro 'readit)) 61*12071Sbaden 62*12071Sbaden 63*12071Sbaden (defun init nil 64*12071Sbaden ; these are the only chars which may delimit numbers 65*12071Sbaden ; (select operator) 66*12071Sbaden 67*12071Sbaden (setq num_delim$ '(#/, #/] #/@ #/: #/} 41 59 32 9 10 #/-)) 68*12071Sbaden 69*12071Sbaden (setq timeIt nil) 70*12071Sbaden (setq char_set (concat 'scan$ char_set)) 71*12071Sbaden (setq in_def nil) 72*12071Sbaden (setq infile nil) 73*12071Sbaden (setq outfile nil) 74*12071Sbaden (setq fn_name 'tmp$$) 75*12071Sbaden (setq in_buf nil) 76*12071Sbaden (setq level 0) ; initialize level to 0 77*12071Sbaden (setq TracedFns nil) ; just to make sure TracedFns is defined 78*12071Sbaden (setq DynTraceFlg nil) ; default of no dynamic tracing 79*12071Sbaden 80*12071Sbaden 81*12071Sbaden 82*12071Sbaden ; These are the builtin function names 83*12071Sbaden 84*12071Sbaden (setq builtins 85*12071Sbaden '( 86*12071Sbaden out ; output fn - for debug only 87*12071Sbaden tl ; left tail 88*12071Sbaden id ; id 89*12071Sbaden atom ; atom 90*12071Sbaden eq ; equal 91*12071Sbaden not ; not 92*12071Sbaden and ; and 93*12071Sbaden or ; or 94*12071Sbaden xor ; xor 95*12071Sbaden null ; null 96*12071Sbaden iota ; counting sequence generator 97*12071Sbaden ; (library functions) 98*12071Sbaden sin 99*12071Sbaden asin 100*12071Sbaden cos 101*12071Sbaden acos 102*12071Sbaden log ; natural 103*12071Sbaden exp 104*12071Sbaden mod 105*12071Sbaden ; (unary origin) 106*12071Sbaden first ; the first element 107*12071Sbaden last ; the last element 108*12071Sbaden front ; all except last 109*12071Sbaden pick ; get nth element 110*12071Sbaden concat ; concat 111*12071Sbaden pair ; makes pairs 112*12071Sbaden split ; splits into two 113*12071Sbaden reverse ; reverse 114*12071Sbaden distl ; distribute left 115*12071Sbaden distr ; distribute right 116*12071Sbaden length ; length 117*12071Sbaden trans ; transpose 118*12071Sbaden while ; while 119*12071Sbaden apndl ; append left 120*12071Sbaden apndr ; append right 121*12071Sbaden tlr ; right tail 122*12071Sbaden rotl ; rotate left 123*12071Sbaden rotr)) ; rotate right 124*12071Sbaden 125*12071Sbaden (initStats) 126*12071Sbaden (initHelp)) 127*12071Sbaden 128*12071Sbaden (defun addHelp (text cmd) 129*12071Sbaden (putprop 'helpCmd text cmd)) 130*12071Sbaden 131*12071Sbaden (defun initHelp nil 132*12071Sbaden (addHelp "fsave <file> Same as csave except without pretty-printing" 'fsave) 133*12071Sbaden (addHelp "cload <file> Load Lisp code from a file (may be compiled)" 'cload) 134*12071Sbaden (addHelp "csave <file> Output Lisp code for all user-defined fns" 'csave) 135*12071Sbaden (addHelp "debug on/off Turn debugger output on/off" 'debug) 136*12071Sbaden (addHelp "lisp Exit to the lisp system (return with '^D')" 'help) 137*12071Sbaden (addHelp "help This text" 'help) 138*12071Sbaden (addHelp "script open/close/append [file] Open or close a script-file" 'script) 139*12071Sbaden (addHelp "timer on/off Turn timer on/off" 'timing) 140*12071Sbaden (addHelp "trace on/off <fn1> ... Start/Stop exec trace of <fn1> ..." 'trace) 141*12071Sbaden (addHelp "stats on/off/reset/print [file] collect and output dynamic stats" 'stats) 142*12071Sbaden (addHelp "fns List all functions" 'fns) 143*12071Sbaden (addHelp "delete <fn1> ... Delete <fn1> ..." 'delete) 144*12071Sbaden (addHelp "pfn <fn1> ... Print source text of <fn1> ..." 'pfn) 145*12071Sbaden (addHelp "save <file> Save defined fns in <file>" 'save) 146*12071Sbaden (addHelp "load <file> Redirect input from <file>" 'load) 147*12071Sbaden ) 148*12071Sbaden 149*12071Sbaden 150*12071Sbaden (setq user-top-level 'runFp) 151*12071Sbaden (setq char_set 'asc) ; set to the type of character set 152*12071Sbaden ; desired at the moment only ascii (asc) 153*12071Sbaden ; supported (no APL at this time). 154*12071Sbaden 155