xref: /csrg-svn/old/lisp/fp/fp.vax/primFp.l (revision 12070)
1*12070Sbaden (setq SCCS-primFp.l "@(#)primFp.l	1.1	04/27/83")
2*12070Sbaden ;  FP interpreter/compiler
3*12070Sbaden ;  Copyright (c) 1982  Scott B. Baden
4*12070Sbaden ;  Berkeley, California
5*12070Sbaden 
6*12070Sbaden (include specials.l)
7*12070Sbaden (declare (special y_l z_l)
8*12070Sbaden   (localf ok_pair ok_eqpair rpair$ lpair$ trnspz allNulls
9*12070Sbaden 	  emptyHeader treeInsWithLen))
10*12070Sbaden 
11*12070Sbaden ; fp addition
12*12070Sbaden 
13*12070Sbaden (defun plus$fp (x)
14*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'plus$fp)))
15*12070Sbaden   (cond ((ok_pair x 'numberp) (plus (car x) (cadr x)))
16*12070Sbaden 	(t (bottom))))
17*12070Sbaden 
18*12070Sbaden ; unit function
19*12070Sbaden 
20*12070Sbaden (defun (u-fnc plus$fp) nil
21*12070Sbaden   0)
22*12070Sbaden 
23*12070Sbaden ; fp subtraction
24*12070Sbaden 
25*12070Sbaden (defun sub$fp (x)
26*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'sub$fp)))
27*12070Sbaden   (cond ((ok_pair x 'numberp) (diff (car x) (cadr x)))
28*12070Sbaden 	(t (bottom))))
29*12070Sbaden 
30*12070Sbaden 
31*12070Sbaden ; unit function
32*12070Sbaden 
33*12070Sbaden (defun (u-fnc sub$fp) nil
34*12070Sbaden   0)
35*12070Sbaden 
36*12070Sbaden ; fp multiplication
37*12070Sbaden 
38*12070Sbaden (defun times$fp (x)
39*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'times$fp)))
40*12070Sbaden   (cond ((ok_pair x 'numberp) (product (car x) (cadr x)))
41*12070Sbaden 	(t (bottom))))
42*12070Sbaden 
43*12070Sbaden ; unit function
44*12070Sbaden 
45*12070Sbaden (defun (u-fnc times$fp) nil
46*12070Sbaden   1)
47*12070Sbaden 
48*12070Sbaden 
49*12070Sbaden ; fp division
50*12070Sbaden 
51*12070Sbaden (defun div$fp (x)
52*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'div$fp)))
53*12070Sbaden   (cond ((ok_pair x 'numberp)
54*12070Sbaden 	 (cond ((not (zerop (cadr x)))
55*12070Sbaden 		(quotient (car x) (cadr x)))
56*12070Sbaden 	       (t (bottom))))
57*12070Sbaden 	(t (bottom))))
58*12070Sbaden 
59*12070Sbaden ; unit function
60*12070Sbaden 
61*12070Sbaden (defun (u-fnc div$fp) nil
62*12070Sbaden   1)
63*12070Sbaden 
64*12070Sbaden 
65*12070Sbaden 
66*12070Sbaden ; logical functions, and or xor not
67*12070Sbaden 
68*12070Sbaden (defun and$fp (x)
69*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'and$fp)))
70*12070Sbaden   (cond ((ok_pair x 'boolp)
71*12070Sbaden 	 (cond
72*12070Sbaden 	  ((eq 'F (car x)) 'F)
73*12070Sbaden 	  (t (cadr x))))
74*12070Sbaden 	(t (bottom))))
75*12070Sbaden 
76*12070Sbaden ; unit function
77*12070Sbaden 
78*12070Sbaden (defun (u-fnc and$fp) nil
79*12070Sbaden   'T)
80*12070Sbaden 
81*12070Sbaden 
82*12070Sbaden (defun or$fp (x)
83*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'or$fp)))
84*12070Sbaden   (cond ((ok_pair x 'boolp)
85*12070Sbaden 	 (cond
86*12070Sbaden 	  ((eq 'T (car x)) 'T)
87*12070Sbaden 	  (t (cadr x))))
88*12070Sbaden 	(t (bottom))))
89*12070Sbaden 
90*12070Sbaden ; unit function
91*12070Sbaden 
92*12070Sbaden (defun (u-fnc or$fp) nil
93*12070Sbaden   'F)
94*12070Sbaden 
95*12070Sbaden 
96*12070Sbaden (defun xor$fp (x)
97*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'xor$fp)))
98*12070Sbaden   (cond ((ok_pair x 'boolp)
99*12070Sbaden 	 (let ((p (car x))
100*12070Sbaden 	       (q (cadr x)))
101*12070Sbaden 	      (cond ((or (and (eq p 'T) (eq q 'T))
102*12070Sbaden 			 (and (eq p 'F) (eq q 'F)))
103*12070Sbaden 		     'F)
104*12070Sbaden 		    (t 'T))))
105*12070Sbaden 	(t (bottom))))
106*12070Sbaden 
107*12070Sbaden ; unit function
108*12070Sbaden 
109*12070Sbaden (defun (u-fnc xor$fp) nil
110*12070Sbaden   'F)
111*12070Sbaden 
112*12070Sbaden 
113*12070Sbaden (defun not$fp (x)
114*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'not$fp)))
115*12070Sbaden   (cond ((not (atom x)) (bottom))
116*12070Sbaden 	((boolp x) (cond ((eq x 'T) 'F) (t 'T)))
117*12070Sbaden 	(t (bottom))))
118*12070Sbaden 
119*12070Sbaden 
120*12070Sbaden ; relational operators,  <  <=  =  >=  >  ~=
121*12070Sbaden 
122*12070Sbaden (defun lt$fp (x)
123*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'lt$fp)))
124*12070Sbaden   (cond ((ok_pair x 'numberp)
125*12070Sbaden 	 (cond ((lessp (car x) (cadr x)) 'T)
126*12070Sbaden 	       (t 'F)))
127*12070Sbaden 	(t (bottom))))
128*12070Sbaden 
129*12070Sbaden (defun le$fp (x)
130*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'le$fp)))
131*12070Sbaden   (cond ((ok_pair x 'numberp)
132*12070Sbaden 	 (cond ((not (greaterp (car x) (cadr x))) 'T)
133*12070Sbaden 	       (t 'F)))
134*12070Sbaden 	(t (bottom))))
135*12070Sbaden 
136*12070Sbaden (defun eq$fp (x)
137*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'eq$fp)))
138*12070Sbaden   (cond ((ok_eqpair x )
139*12070Sbaden 	 (cond ((equal  (car x) (cadr x)) 'T)
140*12070Sbaden 	       (t 'F)))
141*12070Sbaden 	(t (bottom))))
142*12070Sbaden 
143*12070Sbaden (defun ge$fp (x)
144*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'ge$fp)))
145*12070Sbaden   (cond ((ok_pair x 'numberp)
146*12070Sbaden 	 (cond ((not (lessp (car x) (cadr x))) 'T)
147*12070Sbaden 	       (t 'F)))
148*12070Sbaden 	(t (bottom))))
149*12070Sbaden 
150*12070Sbaden (defun gt$fp (x)
151*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'gt$fp)))
152*12070Sbaden   (cond ((ok_pair x 'numberp)
153*12070Sbaden 	 (cond ((greaterp (car x) (cadr x)) 'T)
154*12070Sbaden 	       (t 'F)))
155*12070Sbaden 	(t (bottom))))
156*12070Sbaden 
157*12070Sbaden (defun ne$fp (x)
158*12070Sbaden   (cond (DynTraceFlg (IncrTimes 'ne$fp)))
159*12070Sbaden   (cond ((ok_eqpair x)
160*12070Sbaden 	 (cond ((not (equal  (car x) (cadr x))) 'T)
161*12070Sbaden 	       (t 'F)))
162*12070Sbaden 	(t (bottom))))
163*12070Sbaden 
164*12070Sbaden 
165*12070Sbaden 
166*12070Sbaden ; check arguments for eq and ne
167*12070Sbaden 
168*12070Sbaden (defun ok_eqpair (x)
169*12070Sbaden   (cond ((not (atom x))
170*12070Sbaden 	 (cond ((eq (length x) 2) t)))))
171*12070Sbaden 
172*12070Sbaden ; check arguments for binary arithmetics/logicals
173*12070Sbaden 
174*12070Sbaden (defun ok_pair (x typ)
175*12070Sbaden   (cond ((not (atom x))
176*12070Sbaden 	 (cond ((eq (length x) 2)
177*12070Sbaden 		(cond
178*12070Sbaden 		 ((and (atom (car x)) (atom (cadr x)))
179*12070Sbaden 		  (cond ((and (funcall typ (car x))
180*12070Sbaden 			      (funcall typ (cadr x))) t)))))))))
181*12070Sbaden 
182*12070Sbaden ; check if a variable is boolean, 'T' or 'F'
183*12070Sbaden 
184*12070Sbaden (defun boolp (x)
185*12070Sbaden   (memq x '(T F)))
186*12070Sbaden 
187*12070Sbaden 
188*12070Sbaden (defun undefp (x)
189*12070Sbaden   (eq x '?))
190*12070Sbaden 
191*12070Sbaden (defun tl$fp (x)
192*12070Sbaden   (cond (DynTraceFlg (IncrSize 'tl$fp (size x)) (IncrTimes 'tl$fp)))
193*12070Sbaden   (cond ((atom x) (bottom))
194*12070Sbaden 	(t (cdr x))))
195*12070Sbaden 
196*12070Sbaden 
197*12070Sbaden (defun tlr$fp (x)
198*12070Sbaden   (cond (DynTraceFlg (IncrSize 'tlr$fp (size x)) (IncrTimes 'tlr$fp)))
199*12070Sbaden   (cond ((listp x) (cond
200*12070Sbaden 		    ((onep (length x)) nil)
201*12070Sbaden 		    (t (reverse (cdr (reverse x))))))
202*12070Sbaden 	(t (bottom))))
203*12070Sbaden 
204*12070Sbaden ; this function is just like id$fp execept it also prints its
205*12070Sbaden ; argument on the stdout. It is meant to be used only for debuging.
206*12070Sbaden 
207*12070Sbaden (defun out$fp (x)
208*12070Sbaden   (fpPP x)
209*12070Sbaden   (terpri)
210*12070Sbaden   x)
211*12070Sbaden 
212*12070Sbaden (defun id$fp (x)
213*12070Sbaden   (cond (DynTraceFlg (IncrSize 'id$fp (size x)) (IncrTimes 'id$fp)))
214*12070Sbaden   x)
215*12070Sbaden 
216*12070Sbaden (defun atom$fp (x)
217*12070Sbaden   (cond (DynTraceFlg (IncrSize 'atom$fp (size x)) (IncrTimes 'atom$fp)))
218*12070Sbaden   (cond ((atom x) 'T)
219*12070Sbaden 	(t 'F)))
220*12070Sbaden 
221*12070Sbaden (defun null$fp (x)
222*12070Sbaden   (cond (DynTraceFlg (IncrSize 'null$fp (size x)) (IncrTimes 'null$fp)))
223*12070Sbaden   (cond ((null x) 'T)
224*12070Sbaden 	(t  'F)))
225*12070Sbaden 
226*12070Sbaden (defun reverse$fp (x)
227*12070Sbaden   (cond (DynTraceFlg (IncrSize 'reverse$fp (size x)) (IncrTimes 'reverse$fp)))
228*12070Sbaden   (cond  ((null x) x)
229*12070Sbaden 	 ((listp x) (reverse x))
230*12070Sbaden 	 (t (bottom))))
231*12070Sbaden 
232*12070Sbaden (defun lpair$ (x)
233*12070Sbaden   (cond ((or (undefp x) (not (listp x))) nil)
234*12070Sbaden 	(t
235*12070Sbaden 	 (setq y_l (car x))
236*12070Sbaden 	 (setq z_l (cdr x))
237*12070Sbaden 	 (cond ((null z_l)  t)
238*12070Sbaden 	       (t (cond ((or (not (listp z_l)) (not (onep (length z_l)))) nil)
239*12070Sbaden 			(t (listp (setq z_l (car z_l))))))))))
240*12070Sbaden 
241*12070Sbaden (defun rpair$ (x)
242*12070Sbaden   (cond ((or (undefp x) (not (listp x))) nil)
243*12070Sbaden 	(t
244*12070Sbaden 	 (setq y_l (car x))
245*12070Sbaden 	 (setq z_l (cdr x))
246*12070Sbaden 	 (cond ((null y_l)  t)
247*12070Sbaden 	       (t (cond ((not (listp y_l)) nil)
248*12070Sbaden 			(t (setq z_l (car z_l)) t)))))))
249*12070Sbaden 
250*12070Sbaden 
251*12070Sbaden (defun distl$fp (x)
252*12070Sbaden   (let ((y_l nil) (z_l nil))
253*12070Sbaden        (cond ((lpair$ x)
254*12070Sbaden 	      (cond (DynTraceFlg
255*12070Sbaden 		     (IncrSize 'distl$fp (size z_l)) (IncrTimes 'distl$fp)))
256*12070Sbaden 	      (mapcar '(lambda (u) (list y_l u)) z_l))
257*12070Sbaden 	     (t (bottom)))))
258*12070Sbaden 
259*12070Sbaden (defun distr$fp (x)
260*12070Sbaden   (let ((y_l nil) (z_l nil))
261*12070Sbaden        (cond ((rpair$ x)
262*12070Sbaden 	      (cond (DynTraceFlg
263*12070Sbaden 		     (IncrSize 'distr$fp (size y_l)) (IncrTimes 'distr$fp)))
264*12070Sbaden 	      (mapcar '(lambda (u) (list u z_l)) y_l))
265*12070Sbaden 	     (t (bottom)))))
266*12070Sbaden 
267*12070Sbaden 
268*12070Sbaden (defun length$fp (x)
269*12070Sbaden   (cond (DynTraceFlg (IncrSize 'length$fp (size x)) (IncrTimes 'length$fp)))
270*12070Sbaden   (cond ((listp x) (length x))
271*12070Sbaden 	(t (bottom))))
272*12070Sbaden 
273*12070Sbaden (defun apndl$fp (x)
274*12070Sbaden   (cond ((and (dtpr x) (eq 2 (length x)) (listp (cadr x)))
275*12070Sbaden 	 (cond (DynTraceFlg
276*12070Sbaden 		(IncrSize 'apndl$fp (size (cadr x))) (IncrTimes 'apndl$fp)))
277*12070Sbaden 	 (cons (car x) (cadr x)))
278*12070Sbaden 	(t (bottom))))
279*12070Sbaden 
280*12070Sbaden 
281*12070Sbaden (defun apndr$fp (x)
282*12070Sbaden   (cond ((and (dtpr x) (eq 2 (length x)) (listp (car x)))
283*12070Sbaden 	 (cond (DynTraceFlg
284*12070Sbaden 		(IncrSize 'apndr$fp (size (car x))) (IncrTimes 'apndr$fp)))
285*12070Sbaden 	 (append (car x) (cdr x)))
286*12070Sbaden 	(t (bottom))))
287*12070Sbaden 
288*12070Sbaden 
289*12070Sbaden (defun rotl$fp (x)
290*12070Sbaden   (cond (DynTraceFlg (IncrSize 'rotl$fp (size x)) (IncrTimes 'rotl$fp)))
291*12070Sbaden   (cond ((null x) x)
292*12070Sbaden 	((listp x) (cond ((onep (length x)) x)
293*12070Sbaden 			 (t (append (cdr x) (list (car x))))))
294*12070Sbaden 	(t (bottom))))
295*12070Sbaden 
296*12070Sbaden (defun rotr$fp (x)
297*12070Sbaden   (cond (DynTraceFlg (IncrSize 'rotr$fp (size x)) (IncrTimes 'rotr$fp)))
298*12070Sbaden   (cond ((null x) x)
299*12070Sbaden 	((listp x) (cond ((onep (length x)) x)
300*12070Sbaden 			 (t (reverse (rotl$fp (reverse x))))))
301*12070Sbaden 	(t (bottom))))
302*12070Sbaden 
303*12070Sbaden 
304*12070Sbaden (defun trans$fp (x)
305*12070Sbaden   (If (listp x)
306*12070Sbaden       then (If (allNulls x)
307*12070Sbaden 	       then
308*12070Sbaden 	       (cond (DynTraceFlg
309*12070Sbaden 		      (IncrSize 'trans$fp (size x))
310*12070Sbaden 		      (IncrTimes 'trans$fp)))
311*12070Sbaden 	       nil
312*12070Sbaden 
313*12070Sbaden 	       else
314*12070Sbaden 	       (cond (DynTraceFlg
315*12070Sbaden 		      (IncrSize 'trans$fp
316*12070Sbaden 				(+ (size (car x))
317*12070Sbaden 				   (size (cadr x)))) (IncrTimes 'trans$fp)))
318*12070Sbaden 
319*12070Sbaden 	       (do ((a x (cdr a))
320*12070Sbaden 		    (f (length (car x))))
321*12070Sbaden 		   ((null a) (trnspz x))
322*12070Sbaden 		   (If (or (not (listp (car a))) (not (eq f (length (car a)))))
323*12070Sbaden 		       then (bottom))))
324*12070Sbaden       else
325*12070Sbaden 
326*12070Sbaden       (bottom)))
327*12070Sbaden 
328*12070Sbaden (defun allNulls (x)
329*12070Sbaden   (do ((a x (cdr a)))
330*12070Sbaden       ((null a) t)
331*12070Sbaden       (If (car a) then (return nil))))
332*12070Sbaden 
333*12070Sbaden 
334*12070Sbaden (defun trnspz (l)
335*12070Sbaden   (do
336*12070Sbaden    ((h (emptyHeader (length (car l))))
337*12070Sbaden     (v l (cdr v)))
338*12070Sbaden    ((null v) (mapcar 'car h))
339*12070Sbaden    (mapcar #'(lambda (x y) (tconc x y)) h (car v))))
340*12070Sbaden 
341*12070Sbaden 
342*12070Sbaden (defun emptyHeader (n)
343*12070Sbaden   (do
344*12070Sbaden    ((r nil)
345*12070Sbaden     (c n (1- c)))
346*12070Sbaden    ((= c 0) r)
347*12070Sbaden    (setq r (cons (ncons nil) r))))
348*12070Sbaden 
349*12070Sbaden 
350*12070Sbaden (defun iota$fp (x)
351*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'iota$fp)))
352*12070Sbaden   (cond ((undefp x) x)
353*12070Sbaden 	((listp x) (bottom))
354*12070Sbaden 	((not (fixp x)) (bottom))
355*12070Sbaden 	((lessp x 0) (bottom))
356*12070Sbaden 	((zerop x) nil)
357*12070Sbaden 	(t
358*12070Sbaden 	 (do ((z x (1- z))
359*12070Sbaden 	      (rslt nil))
360*12070Sbaden 	     ((zerop z) rslt)
361*12070Sbaden 	     (setq rslt (cons z rslt))))))
362*12070Sbaden 
363*12070Sbaden ; this is the stuff that was added by dorab patel to make this have
364*12070Sbaden ; the same functions as David Lahti's interpreter
365*12070Sbaden 
366*12070Sbaden 
367*12070Sbaden ;; Modified by SBB to accept nil as a valid input
368*12070Sbaden 
369*12070Sbaden (defun last$fp (x)
370*12070Sbaden   (cond (DynTraceFlg (IncrSize 'last$fp (size x)) (IncrTimes 'last$fp)))
371*12070Sbaden     (cond ((null x) nil)
372*12070Sbaden 	  ((listp x) (car (last x)))
373*12070Sbaden 	  (t (bottom))))
374*12070Sbaden 
375*12070Sbaden ;; Added by SBB
376*12070Sbaden 
377*12070Sbaden (defun first$fp (x)
378*12070Sbaden   (If DynTraceFlg then (IncrSize 'first$fp (size x)) (IncrTimes 'first$fp))
379*12070Sbaden   (If (not (listp x)) then (bottom)
380*12070Sbaden       else (car x)))
381*12070Sbaden 
382*12070Sbaden (defun front$fp (x)
383*12070Sbaden   (cond (DynTraceFlg (IncrSize 'front$fp (size x)) (IncrTimes 'front$fp)))
384*12070Sbaden     (cond ((null x) (bottom))
385*12070Sbaden 	  ((listp x) (nreverse (cdr (nreverse x))))
386*12070Sbaden 	  (t (bottom))))
387*12070Sbaden 
388*12070Sbaden (defun pick$fp (sAndX)
389*12070Sbaden   (let ((s (car sAndX))
390*12070Sbaden 	(x (cadr sAndX)))
391*12070Sbaden        (cond (DynTraceFlg (IncrSize 'pick$fp (size x)) (IncrTimes 'pick$fp)))
392*12070Sbaden 
393*12070Sbaden        (If (or (not (fixp s)) (zerop s)) then  (bottom)
394*12070Sbaden 	   else
395*12070Sbaden 
396*12070Sbaden 	   (progn
397*12070Sbaden 	    (cond (DynTraceFlg
398*12070Sbaden 		   (IncrTimes 'select$fp)
399*12070Sbaden 		   (IncrSize 'select$fp (size x))))
400*12070Sbaden 
401*12070Sbaden 	    (cond ((not (listp x)) (bottom))
402*12070Sbaden 		  ((plusp s)
403*12070Sbaden 		   (If (greaterp s (length x)) then (bottom)
404*12070Sbaden 		       else (nthelem s x)))
405*12070Sbaden 		  ((minusp s)
406*12070Sbaden 		   (let  ((len (length x)))
407*12070Sbaden 			 (If (greaterp (absval s) len) then (bottom)
408*12070Sbaden 			     else (nthelem (plus len 1 s) x)))))))))
409*12070Sbaden 
410*12070Sbaden 
411*12070Sbaden 
412*12070Sbaden (defun concat$fp (x)
413*12070Sbaden   (cond (DynTraceFlg (IncrSize 'concat$fp (size x)) (IncrTimes 'concat$fp)))
414*12070Sbaden 
415*12070Sbaden   (If (listp x)
416*12070Sbaden       then
417*12070Sbaden       (do ((a x  (cdr a))
418*12070Sbaden 	   (y (copy x) (cdr y))
419*12070Sbaden 	   (rslt (ncons nil)))
420*12070Sbaden 	  ((null a) (car rslt))
421*12070Sbaden 	  (If (not (listp (car a))) then (bottom))
422*12070Sbaden 
423*12070Sbaden 	  (lconc rslt (car y)))
424*12070Sbaden 
425*12070Sbaden       else (bottom)))
426*12070Sbaden 
427*12070Sbaden 
428*12070Sbaden (defun pair$fp (x)
429*12070Sbaden   (cond (DynTraceFlg (IncrSize 'pair$fp (size x)) (IncrTimes 'pair$fp)))
430*12070Sbaden     (cond ((not (listp x)) (bottom))
431*12070Sbaden 	  ((null x) (bottom))
432*12070Sbaden 	  (t (do ((count 0 (add count 2)) ; set local vars
433*12070Sbaden 		  (max (length x))
434*12070Sbaden 		  (ret nil))
435*12070Sbaden 		 ((not (lessp count max)) (nreverse ret)) ; return ret at end
436*12070Sbaden 		 (cond ((equal (diff max count) 1) ; if only one element left
437*12070Sbaden 			(setq ret (cons (list (car x)) ret)))
438*12070Sbaden 		       (t (setq ret (cons (list (car x) (cadr x)) ret))
439*12070Sbaden 			  (setq x (cddr x))))))))
440*12070Sbaden 
441*12070Sbaden 
442*12070Sbaden (defun split$fp (x)
443*12070Sbaden   (cond (DynTraceFlg (IncrSize 'split$fp (size x)) (IncrTimes 'split$fp)))
444*12070Sbaden   (cond ((not (listp x)) (bottom))
445*12070Sbaden 	((null x) (bottom))
446*12070Sbaden 	((eq (length x) 1) (list x nil))
447*12070Sbaden 	(t
448*12070Sbaden 	 (do ((count 1 (add1 count))
449*12070Sbaden 	      (mid (fix (plus 0.5 (quotient (length x) 2.0))))
450*12070Sbaden 	      (ret nil))
451*12070Sbaden 	     ((greaterp count mid) (cons (nreverse ret) (list x)))
452*12070Sbaden 	     (setq ret (cons (car x) ret))
453*12070Sbaden 	     (setq x (cdr x))))))
454*12070Sbaden 
455*12070Sbaden 
456*12070Sbaden ; Library functions: sin, asin, cos, acos, log, exp, mod
457*12070Sbaden 
458*12070Sbaden (defun sin$fp (x)
459*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'sin$fp)))
460*12070Sbaden   (cond ((numberp x) (sin x))
461*12070Sbaden 	(t (bottom))))
462*12070Sbaden 
463*12070Sbaden (defun asin$fp (x)
464*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'asin$fp)))
465*12070Sbaden   (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (asin x))
466*12070Sbaden 	(t (bottom))))
467*12070Sbaden 
468*12070Sbaden (defun cos$fp (x)
469*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'cos$fp)))
470*12070Sbaden   (cond ((numberp x) (cos x))
471*12070Sbaden 	(t (bottom))))
472*12070Sbaden 
473*12070Sbaden (defun acos$fp (x)
474*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'acos$fp)))
475*12070Sbaden   (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (acos x))
476*12070Sbaden 	(t (bottom))))
477*12070Sbaden 
478*12070Sbaden (defun log$fp (x)
479*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'log$fp)))
480*12070Sbaden   (cond ((and (numberp x) (not (minusp x))) (log x))
481*12070Sbaden 	(t (bottom))))
482*12070Sbaden 
483*12070Sbaden (defun exp$fp (x)
484*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'exp$fp)))
485*12070Sbaden   (cond ((numberp x) (exp x))
486*12070Sbaden 	(t (bottom))))
487*12070Sbaden 
488*12070Sbaden (defun mod$fp (x)
489*12070Sbaden   (cond (DynTraceFlg  (IncrTimes 'mod$fp)))
490*12070Sbaden   (cond ((ok_pair x 'numberp) (mod (car x) (cadr x)))
491*12070Sbaden 	(t (bottom))))
492*12070Sbaden 
493*12070Sbaden 
494*12070Sbaden ;; Tree insert function
495*12070Sbaden 
496*12070Sbaden 
497*12070Sbaden (defun treeIns$fp (fn x)
498*12070Sbaden   (If (not (listp x)) then  (bottom)
499*12070Sbaden       else
500*12070Sbaden       (If (null x) then  (unitTreeInsert fn)
501*12070Sbaden 	  else
502*12070Sbaden 	  (let ((len (length x)))
503*12070Sbaden 	       (If (onep len) then (car x)
504*12070Sbaden 		   else
505*12070Sbaden 		   (If (twop len) then (funcall fn x )
506*12070Sbaden 		       else (treeInsWithLen fn x len)))))))
507*12070Sbaden 
508*12070Sbaden 
509*12070Sbaden (defun treeInsWithLen (fn x len)
510*12070Sbaden   (let* ((r1 (copy x))
511*12070Sbaden 	 (nLen (fix (plus 0.5 (quotient len 2.0))))
512*12070Sbaden 	 (p (Cnth r1 nLen))
513*12070Sbaden 	 (r2 (cdr p)))
514*12070Sbaden 	(rplacd p nil)
515*12070Sbaden 	(let ((saveLevel level))
516*12070Sbaden 	     (setq level (1+ level))
517*12070Sbaden 	     (let ((R1 (treeIns fn r1 nLen)))
518*12070Sbaden 		  (setq level (1+ saveLevel))
519*12070Sbaden 		  (let ((R2 (treeIns fn r2 (diff len nLen))))
520*12070Sbaden 		       (setq level saveLevel)
521*12070Sbaden 		       (funcall fn `(,R1 ,R2)))))))
522