xref: /csrg-svn/old/lisp/fp/fp.vax/fpMain.l (revision 15193)
1*15193Sbaden (setq SCCS-fpMain.l "@(#)fpMain.l	1.2	10/08/83")
212065Sbaden ;  FP interpreter/compiler
312065Sbaden ;  Copyright (c) 1982  Scott B. Baden
412065Sbaden ;  Berkeley, California
512065Sbaden 
612065Sbaden ; Main routine to start up FP
712065Sbaden 
812065Sbaden (include specials.l)
912065Sbaden (declare (special arg parse_tree)
1012065Sbaden   (localf syntaxErr synErrMsg last_cr p_indic display rtime doExit)
1112065Sbaden   )
1212065Sbaden 
1312065Sbaden ; may ask for debug output,
1412065Sbaden ; specifiy character set, only ASCII (asc) supported at this time.
1512065Sbaden ; exit to shell if invoked  from it.
1612065Sbaden 
1712065Sbaden (defun fpMain (debug from_shell)
1812065Sbaden 
1912065Sbaden   (do ((arg nil)
2012065Sbaden        (parse_tree (*catch '(parse$err end_condit end_while)  (parse 'top_lev))
2112065Sbaden 		   (*catch '(parse$err  end_condit end_while) (parse 'top_lev))))
2212065Sbaden 
2312065Sbaden       ; exit if an EOF has been entered from the terminal
2412065Sbaden       ; (and it was the only character entered on the line)
2512065Sbaden 
2612065Sbaden       ((and (eq parse_tree 'eof$$) (null infile))
2712065Sbaden        (terpri)
2812065Sbaden        (doExit from_shell))	 ; in any case exit
2912065Sbaden 
3012065Sbaden       ; if the EOF was from a file close it and then accept
3112065Sbaden       ; input from terminal again
3212065Sbaden 
3312065Sbaden       (cond
3412065Sbaden        ((not (eq parse_tree 'eof$$))
3512065Sbaden 	(cond (debug (print parse_tree)
3612065Sbaden 		     (terpri)))
3712065Sbaden 	(cond
3812065Sbaden 	 ((not (eq parse_tree 'cmd$$))
3912065Sbaden 	  (cond
4012065Sbaden 	   ((not (listp parse_tree))
4112065Sbaden 	    (let
4212065Sbaden 	     ((defn (put_fn fn_name parse_tree)))	; define the function
4312065Sbaden 	     (cond (in_def
4412065Sbaden 		    (patom "{")
4512065Sbaden 		    (patom (setq usr_fn_name
4612065Sbaden 				 (implode
4712065Sbaden 				  (nreverse (cdddr (nreverse (explode fn_name)))))))
4812065Sbaden 		    (patom "}") (terpri)
4912065Sbaden 		    (putprop 'sources in_buf usr_fn_name)))
5012065Sbaden 	     (cond ((and debug in_def) (pp fn_name))))
5112065Sbaden 
5212065Sbaden 	    ; read in an FP sequence once a colon (apply) has been detected
5312065Sbaden 
5412065Sbaden 	    (cond ((not in_def)
5512065Sbaden 		   (cond ((and (null infile) ptport)
5612065Sbaden 			  (do
5712065Sbaden 			   ((c (tyipeek) (tyipeek)))
5812065Sbaden 			   ((or (null (memq c #.whiteSpace))))
5912065Sbaden 			   (Tyi))))
6012065Sbaden 		   (setq arg (*catch 'parse$err  (get_obj nil)))
6112065Sbaden 
6212065Sbaden 		   (cond ((find 'err$$ arg)
6312065Sbaden 			  (syntaxErr))
6412065Sbaden 			 ((undefp arg)
6512065Sbaden 			  (terpri) (patom '?) (terpri))
6612065Sbaden 			 (t
6712065Sbaden 			  (let ((sPlist
6812065Sbaden 				 (If DynTraceFlg then
6912065Sbaden 				     (copy (plist 'Measures)) else nil))
70*15193Sbaden 				(wcTime1 (sys:time))
7112065Sbaden 				(time1 (ptime))
7212065Sbaden 				(rslt (*catch 'bottom$up (funcall fn_name arg)))
7312065Sbaden 				(time2 (ptime))
74*15193Sbaden 				(wcTime2 (sys:time)))
7512065Sbaden 
7612065Sbaden 			       (fpPP rslt)
7712065Sbaden 
7812065Sbaden 			       (If (and DynTraceFlg (undefp rslt)) then (setplist 'Measures sPlist))
7912065Sbaden 			       (cond (timeIt
8012065Sbaden 				      (let ((gcTime (diff (cadr time2) (cadr time1))))
8112065Sbaden 					   (msg N "cpu + gc [wc] = ")
8212065Sbaden 					   (rtime  (diff (diff (car time2) (car time1)) gcTime) 60.0)
8312065Sbaden 					   (patom " + ")
8412065Sbaden 					   (rtime  gcTime 60.0)
8512065Sbaden 					   (patom " [")
8612065Sbaden 					   (rtime (diff wcTime2 wcTime1) 1.0)
8712065Sbaden 					   (msg "]"))
8812065Sbaden 				      (msg (N 2))))))))))
8912065Sbaden 
9012065Sbaden 	   (t (syntaxErr) ))))))
9112065Sbaden 
9212065Sbaden 
9312065Sbaden       (cond (in_def  (setq fn_name 'tmp$$)))
9412065Sbaden 
9512065Sbaden       (cond ((and infile (eq parse_tree 'eof$$))
9612065Sbaden 	     (patom "      ") (close infile) (setq infile nil))
9712065Sbaden 
9812065Sbaden 	    (t (cond ((and (null infile) (not (eq parse_tree 'eof$$)))
9912065Sbaden 		      (patom "      ")))))
10012065Sbaden 
10112065Sbaden       (setq level 0)
10212065Sbaden       (setq in_buf nil)
10312065Sbaden       (setq in_def nil)))
10412065Sbaden 
10512065Sbaden 
10612065Sbaden ; Display a LISP list as an equivalent FP sequence
10712065Sbaden 
10812065Sbaden (defun display (obj)
10912065Sbaden   (cond ((null obj) (patom "<>"))
11012065Sbaden 	((atom obj) (patom obj))
11112065Sbaden 	((listp obj)
11212065Sbaden 	 (patom "<")
11312065Sbaden 	 (maplist
11412065Sbaden 	  '(lambda (x)
11512065Sbaden 		   (display (car x))
11612065Sbaden 		   (cond ((not (onep (length x))) (patom " ")))) obj)
11712065Sbaden 	 (patom ">"))))
11812065Sbaden 
11912065Sbaden ; Form a character string  of a LISP list as an equivalent FP sequence
12012065Sbaden 
12112065Sbaden (defun put_obj (obj)
12212065Sbaden   (cond ((null obj) "<>")
12312065Sbaden 	((atom obj) obj)
12412065Sbaden 	((listp obj)
12512065Sbaden 	 (cond ((onep (length obj))
12612065Sbaden 		(concat "<" (put_obj (car obj)) ">"))
12712065Sbaden 	       (t (do
12812065Sbaden 		   ((xx obj (cdr xx))
12912065Sbaden 		    (zz t nil)
13012065Sbaden 		    (yy "<"))
13112065Sbaden 		   ((zerop (length xx)) (concat yy ">"))
13212065Sbaden 		   (cond ((not zz) (setq yy (concat yy " "))))
13312065Sbaden 		   (setq yy (concat yy (put_obj (car xx))))))))))
13412065Sbaden 
13512065Sbaden 
13612065Sbaden 
13712065Sbaden (defun rtime (time scale)
13812065Sbaden   (patom (quotient (float (fix (product 100 (quotient time scale))))
13912065Sbaden 		   100.0)))
14012065Sbaden 
14112065Sbaden (defun doExit (exitCond)
14212065Sbaden   (cond (exitCond
14312065Sbaden 	 (dontLoseStats)
14412065Sbaden 	 (and (portp 'traceport) (close traceport)) ; if traceport is open
14512065Sbaden 	 (and ptport (close ptport))	  	    ; if script port is open
14612065Sbaden 	 (exit))))
14712065Sbaden 
14812065Sbaden 
14912065Sbaden (defun syntaxErr nil
15012065Sbaden   (let ((piport infile)
15112065Sbaden 	(tbuf (ncons nil)))
15212065Sbaden        (cond ((and in_def (eq #/} (car in_buf)))
15312065Sbaden 	      (do ((c (Tyi) (Tyi)))
15412065Sbaden 		  ((memq c '(-1 #.CR))))
15512065Sbaden 	      (synErrMsg)
15612065Sbaden 	      (p_indic)
15712065Sbaden 	      )
15812065Sbaden 
15912065Sbaden 	     (t (cond (in_def
16012065Sbaden 		       (cond ((and
16112065Sbaden 			       (eq #.CR
16212065Sbaden 				   (do ((c (tyipeek) (tyipeek))
16312065Sbaden 					(e nil))
16412065Sbaden 				       ((memq c '(-1 #/} #.CR))
16512065Sbaden 					(If (eq c #/}) then
16612065Sbaden 					    (progn
16712065Sbaden 					     (tconc tbuf c)
16812065Sbaden 					     (setq e (Tyi)))
16912065Sbaden 
17012065Sbaden 					    else
17112065Sbaden 
17212065Sbaden 					    (If (eq c #.CR) then
17312065Sbaden 						(setq e (Tyi))))
17412065Sbaden 
17512065Sbaden 					(synErrMsg)
17612065Sbaden 					(mapcar 'p_strng (car tbuf))
17712065Sbaden 					(p_indic)
17812065Sbaden 					e)
17912065Sbaden 				       (tconc tbuf (Tyi))))
18012065Sbaden 			       infile)
18112065Sbaden 
18212065Sbaden 			      (do ((c (tyipeek) (tyipeek))
18312065Sbaden 				   (tbuf (ncons nil)))
18412065Sbaden 				  ((memq c '(-1 #/}))
18512065Sbaden 				   (If (eq c #/})
18612065Sbaden 				   then (tconc tbuf (Tyi)))
18712065Sbaden 				   (mapcar 'p_strng (car tbuf))
18812065Sbaden 				   (terpri)
18912065Sbaden 				   (If (eq c #/}) then
19012065Sbaden 				       (do ((c (Tyi) (Tyi)))
19112065Sbaden 					   ((memq c '(-1 #.CR)))))
19212065Sbaden 				   )
19312065Sbaden 
19412065Sbaden 				  (tconc tbuf (Tyi))))))
19512065Sbaden 
19612065Sbaden 		      (t
19712065Sbaden 		       (do ((c (tyipeek) (tyipeek)))
19812065Sbaden 			   ((memq c '(-1 #.CR))
19912065Sbaden 			    (Tyi)
20012065Sbaden 			    (synErrMsg)
20112065Sbaden 			    (mapcar 'p_strng (car tbuf))
20212065Sbaden 			    (p_indic))
20312065Sbaden 			   (tconc tbuf (Tyi)))))))
20412065Sbaden        ))
20512065Sbaden 
20612065Sbaden (defun synErrMsg nil
20712065Sbaden   (msg N "Syntax Error:"
20812065Sbaden        (N 2))
20912065Sbaden   (mapcar 'p_strng (reverse in_buf)))
21012065Sbaden 
21112065Sbaden 
21212065Sbaden (defun p_indic nil
21312065Sbaden   (msg N (B (length (cdr (last_cr (reverse in_buf))))) "^" N)
21412065Sbaden   (If (null infile) then (terpr)))
21512065Sbaden 
21612065Sbaden (defun last_cr (zy)
21712065Sbaden   (cond ((null (memq #.CR zy)) zy) (t (last_cr (cdr (memq #.CR zy))))))
21812065Sbaden 
21912065Sbaden ; throw bottom to the next level
22012065Sbaden ; This shortens the compiled code
22112065Sbaden 
22212065Sbaden (defun bottom nil
22312065Sbaden   (*throw 'bottom$up '?))
224