xref: /csrg-svn/old/lisp/fp/fp.vax/codeGen.l (revision 12065)
1*12065Sbaden (setq SCCS-codeGen.l "@(#)codeGen.l	1.1	04/27/83")
2*12065Sbaden ;  FP interpreter/compiler
3*12065Sbaden ;  Copyright (c) 1982  Scott B. Baden
4*12065Sbaden ;  Berkeley, California
5*12065Sbaden 
6*12065Sbaden ; Main Routine to do code generation
7*12065Sbaden 
8*12065Sbaden (include specials.l)
9*12065Sbaden (declare
10*12065Sbaden   (localf build_constr mName condit$fp alpha$fp insert$fp ti$fp while$fp)
11*12065Sbaden   )
12*12065Sbaden 
13*12065Sbaden (defmacro getFform (xx)
14*12065Sbaden   `(implode (nreverse `(p f ,@(cdr (nreverse (explodec (cxr 0 ,xx))))))))
15*12065Sbaden 
16*12065Sbaden (defun mName (name)
17*12065Sbaden   (cond ((atom name) `',name)
18*12065Sbaden 	(t `',(getFform name))))
19*12065Sbaden 
20*12065Sbaden (defun mNameI (name)
21*12065Sbaden   (cond ((atom name) name)
22*12065Sbaden 	(t (getFform name))))
23*12065Sbaden 
24*12065Sbaden (defun codeGen (ptree)
25*12065Sbaden   (cond ((atom ptree) `',ptree)		; primitive or
26*12065Sbaden 							; user defined
27*12065Sbaden 
28*12065Sbaden 	((eq (cxr 0 ptree) 'alpha$$)			; apply to all
29*12065Sbaden 	 (alpha$fp (cxr 1 ptree)))
30*12065Sbaden 
31*12065Sbaden 	((eq (cxr 0 ptree) 'insert$$)			; insert
32*12065Sbaden 	 (insert$fp (cxr 1 ptree)))
33*12065Sbaden 
34*12065Sbaden 	((eq (cxr 0 ptree) 'ti$$)			; tree insert
35*12065Sbaden 	 (ti$fp (cxr 1 ptree)))
36*12065Sbaden 
37*12065Sbaden 	((eq (cxr 0 ptree) 'select$$)			; selector
38*12065Sbaden 	 (let ((sel (cxr 1 ptree)))
39*12065Sbaden 
40*12065Sbaden 	      (If (zerop sel) 		; No stats for errors
41*12065Sbaden 		  then `#'(lambda (x) (bottom))
42*12065Sbaden 
43*12065Sbaden 		  else
44*12065Sbaden 
45*12065Sbaden 		  `#'(lambda (x)
46*12065Sbaden 			     (cond ((not (listp x)) (bottom)))
47*12065Sbaden 			     (cond (DynTraceFlg (measSel ,sel x)))
48*12065Sbaden 			     ,(cond ((plusp sel)
49*12065Sbaden 				     `(If (greaterp ,sel (length x))
50*12065Sbaden 					  then (bottom)
51*12065Sbaden 					  else (nthelem ,sel x)))
52*12065Sbaden 
53*12065Sbaden 
54*12065Sbaden 				    ((minusp sel)
55*12065Sbaden 				     `(let  ((len (length x)))
56*12065Sbaden 					    (If (greaterp ,(absval sel) len)
57*12065Sbaden 						then (bottom)
58*12065Sbaden 						else (nthelem (plus len ,(1+ sel)) x)))))))))
59*12065Sbaden 
60*12065Sbaden 
61*12065Sbaden 
62*12065Sbaden 	((eq (cxr 0 ptree) 'constant$$)			; constant
63*12065Sbaden 	 (let ((const (cxr 1 ptree)))
64*12065Sbaden 	      (If (eq const '?)
65*12065Sbaden 		  then `#'(lambda (x) (bottom))
66*12065Sbaden 
67*12065Sbaden 		  else
68*12065Sbaden 
69*12065Sbaden 		  `#'(lambda (x)
70*12065Sbaden 			     (cond (DynTraceFlg (measCons ,const x)))
71*12065Sbaden 			     ,const))))
72*12065Sbaden 
73*12065Sbaden 
74*12065Sbaden 
75*12065Sbaden 	((eq (cxr 0 ptree) 'condit$$)			; conditional
76*12065Sbaden 	 (condit$fp (cxr 1 ptree) (cxr 2 ptree) (cxr 3 ptree)))
77*12065Sbaden 
78*12065Sbaden 	((eq (cxr 0 ptree) 'while$$)			; while
79*12065Sbaden 	 (while$fp (cxr 1 ptree) (cxr 2 ptree)))
80*12065Sbaden 
81*12065Sbaden 
82*12065Sbaden 	((eq (cxr 0 ptree) 'compos$$)			; composition
83*12065Sbaden 	 (let ((cm1 (cxr 1 ptree))
84*12065Sbaden 	       (cm2 (cxr 2 ptree)))
85*12065Sbaden 	      `#'(lambda (x)
86*12065Sbaden 			 (cond (DynTraceFlg
87*12065Sbaden 				(measComp ,(mName cm1) ,(mName cm2) x)))
88*12065Sbaden 			 (funcall ,(codeGen cm1)
89*12065Sbaden 				  (funcall ,(codeGen cm2)
90*12065Sbaden 					   x)))))
91*12065Sbaden 
92*12065Sbaden 
93*12065Sbaden 	((eq (cxr 0 ptree) 'constr$$)
94*12065Sbaden 	 (build_constr ptree))				; construction
95*12065Sbaden 
96*12065Sbaden 	(t 'error)))					; error, sb '?
97*12065Sbaden 
98*12065Sbaden 
99*12065Sbaden ; build up the list of arguments for a construction
100*12065Sbaden 
101*12065Sbaden (defun build_constr (pt)
102*12065Sbaden   (cond ((and (eq 2 (hunksize pt)) (null (cxr 1 pt)))
103*12065Sbaden 	 `#'(lambda (x) (cond (DynTraceFlg (measCons nil x)))  nil))
104*12065Sbaden 	(t
105*12065Sbaden 	 (do ((i 2 (1+ i))
106*12065Sbaden 	      (stat (list `,(mNameI (cxr 1 pt))))
107*12065Sbaden 	      (con (list (codeGen (cxr 1 pt)))))
108*12065Sbaden 	     ((greaterp i (1- (hunksize pt)))
109*12065Sbaden 	      (return
110*12065Sbaden 	       (funcall 'constr$fp con stat)))
111*12065Sbaden 	     (setq stat (append stat (list `,(mNameI (cxr i pt)))))
112*12065Sbaden 	     (setq con (append con (list (codeGen (cxr i pt)))))))))
113*12065Sbaden 
114*12065Sbaden 
115*12065Sbaden ; generate a lisp function definition from an FP parse tree
116*12065Sbaden 
117*12065Sbaden (defun put_fn (fn_name p_tree)
118*12065Sbaden   (untraceDel (extName fn_name))
119*12065Sbaden   (putd fn_name
120*12065Sbaden 	`(lambda (x)
121*12065Sbaden 		 (cond (DynTraceFlg (IncrUDF ',fn_name x)))
122*12065Sbaden 		 (funcall ,(codeGen p_tree) x))))
123*12065Sbaden 
124*12065Sbaden 
125*12065Sbaden ; The Functional forms
126*12065Sbaden ;
127*12065Sbaden 
128*12065Sbaden 
129*12065Sbaden ; fp conditional
130*12065Sbaden 
131*12065Sbaden (def condit$fp
132*12065Sbaden   (lambda (Pptree Tptree Fptree)
133*12065Sbaden 	  (let ((test (codeGen Pptree))
134*12065Sbaden 		(true (codeGen Tptree))
135*12065Sbaden 		(false (codeGen Fptree)))
136*12065Sbaden 
137*12065Sbaden 	       (let ((q
138*12065Sbaden 		      `(lambda (x)
139*12065Sbaden 				(cond (DynTraceFlg
140*12065Sbaden 				       (measCond
141*12065Sbaden 					,(mName Pptree)
142*12065Sbaden 					,(mName Tptree)
143*12065Sbaden 					,(mName Fptree) x)))
144*12065Sbaden 
145*12065Sbaden 				(let ((z (funcall ,test x)))
146*12065Sbaden 				     (cond
147*12065Sbaden 				      ((eq 'T z) (funcall ,true x))
148*12065Sbaden 				      ((eq 'F z) (funcall ,false x))
149*12065Sbaden 				      (t (bottom)))))))
150*12065Sbaden 		    `(function ,q)))))
151*12065Sbaden 
152*12065Sbaden 
153*12065Sbaden 
154*12065Sbaden ; construction
155*12065Sbaden 
156*12065Sbaden (def constr$fp
157*12065Sbaden   (lexpr (v)
158*12065Sbaden 	 (let* ((vl (listify v))
159*12065Sbaden 		(q
160*12065Sbaden 		 `(lambda (x)
161*12065Sbaden 			  (cond (DynTraceFlg
162*12065Sbaden 				 (measConstr ',(cadr vl) x)))
163*12065Sbaden 			  (let* ((savelevel level)
164*12065Sbaden 				 (h
165*12065Sbaden 				  (list
166*12065Sbaden 				   ,@(mapcar
167*12065Sbaden 				      #'(lambda
168*12065Sbaden 					 (y)
169*12065Sbaden 					 `(let ((r ,`(funcall ,y x)))
170*12065Sbaden 					       (setq level savelevel)
171*12065Sbaden 					       r))
172*12065Sbaden 				      (car vl)))))
173*12065Sbaden 				(setq level savelevel)
174*12065Sbaden 				h
175*12065Sbaden 				))))
176*12065Sbaden 	       `(function ,q))))
177*12065Sbaden 
178*12065Sbaden 
179*12065Sbaden 
180*12065Sbaden 
181*12065Sbaden ; apply to all
182*12065Sbaden 
183*12065Sbaden (def alpha$fp
184*12065Sbaden   (lambda (ptree)
185*12065Sbaden 	  (let* ((fn (codeGen ptree))
186*12065Sbaden 		 (q
187*12065Sbaden 		  `(lambda (x)
188*12065Sbaden 			   (cond (DynTraceFlg
189*12065Sbaden 				  (measAlph ,(mName ptree) x)))
190*12065Sbaden 			   (cond ((null x) nil)
191*12065Sbaden 				 ((not (listp x)) (bottom))
192*12065Sbaden 				 (t
193*12065Sbaden 				  (let* ((savelevel level)
194*12065Sbaden 					 (h
195*12065Sbaden 					  (mapcar
196*12065Sbaden 					   '(lambda (y)
197*12065Sbaden 						    (setq level savelevel)
198*12065Sbaden 						    (funcall ,fn y))
199*12065Sbaden 					   x)))
200*12065Sbaden 
201*12065Sbaden 					(setq level savelevel)
202*12065Sbaden 					h))))))
203*12065Sbaden 		`(function ,q))))
204*12065Sbaden 
205*12065Sbaden 
206*12065Sbaden ; insert
207*12065Sbaden 
208*12065Sbaden (def insert$fp
209*12065Sbaden   (lambda (ptree)
210*12065Sbaden 	  (let* ((fn (codeGen ptree))
211*12065Sbaden 		 (q
212*12065Sbaden 		  `(lambda (x)
213*12065Sbaden 			   (cond (DynTraceFlg (measIns ,(mName ptree) x)))
214*12065Sbaden 			   (cond ((not (listp x)) (bottom))
215*12065Sbaden 				 ((null x)
216*12065Sbaden 				  (let ((ufn (get 'u-fnc ,fn)))
217*12065Sbaden 				       (cond
218*12065Sbaden 					(ufn (funcall ufn))
219*12065Sbaden 					(t (bottom)))))
220*12065Sbaden 				 (t (let ((v (reverse x)) (z nil))
221*12065Sbaden 					 (setq z (car v))
222*12065Sbaden 					 (setq v (cdr v))
223*12065Sbaden 					 (mapc '(lambda (y) (setq z (funcall ,fn (list y z)))) v)
224*12065Sbaden 					 z))))))
225*12065Sbaden 		`(function ,q))))
226*12065Sbaden 
227*12065Sbaden 
228*12065Sbaden 
229*12065Sbaden 
230*12065Sbaden (defun while$fp (pFn fFn)
231*12065Sbaden   (let* ((fn_p (codeGen pFn))
232*12065Sbaden 	 (fn_f (codeGen fFn))
233*12065Sbaden 	 (q
234*12065Sbaden 	  `(lambda (x)
235*12065Sbaden 		   (cond (DynTraceFlg
236*12065Sbaden 			  (measWhile ,(mName pFn) ,(mName fFn) x)))
237*12065Sbaden 		   (do
238*12065Sbaden 		    ((z (funcall ,fn_p x) (funcall ,fn_p rslt))
239*12065Sbaden 		     (rslt x))
240*12065Sbaden 		    ((eq 'F z) rslt)
241*12065Sbaden 		    (cond ((undefp z) (bottom)))
242*12065Sbaden 		    (setq rslt (funcall ,fn_f rslt))))))
243*12065Sbaden 	`(function ,q)))
244*12065Sbaden 
245*12065Sbaden 
246*12065Sbaden 
247*12065Sbaden 
248*12065Sbaden ; Tree insert
249*12065Sbaden 
250*12065Sbaden (def ti$fp
251*12065Sbaden   (lambda (ptree)
252*12065Sbaden 	  (let* ((fn (codeGen ptree))
253*12065Sbaden 		 (q
254*12065Sbaden 		  `(lambda (x)
255*12065Sbaden 			   (cond (DynTraceFlg (measAi ,(mName ptree) x)))
256*12065Sbaden 			   (treeIns$fp ,fn x))))
257*12065Sbaden 		`(function ,q))))
258