xref: /csrg-svn/old/lisp/fp/fp.vax/primFp.l (revision 21731)
112070Sbaden ;  FP interpreter/compiler
212070Sbaden ;  Copyright (c) 1982  Scott B. Baden
312070Sbaden ;  Berkeley, California
4*21731Sdist ;
5*21731Sdist ;  Copyright (c) 1982 Regents of the University of California.
6*21731Sdist ;  All rights reserved.  The Berkeley software License Agreement
7*21731Sdist ;  specifies the terms and conditions for redistribution.
8*21731Sdist ;
9*21731Sdist (setq SCCS-primFp.l "@(#)primFp.l	5.1 (Berkeley) 05/31/85")
1012070Sbaden 
11*21731Sdist ;  FP interpreter/compiler
1212070Sbaden (include specials.l)
1312070Sbaden (declare (special y_l z_l)
1412070Sbaden   (localf ok_pair ok_eqpair rpair$ lpair$ trnspz allNulls
1512092Sbaden 	  allLists emptyHeader treeInsWithLen))
1612070Sbaden 
1712070Sbaden ; fp addition
1812070Sbaden 
1912070Sbaden (defun plus$fp (x)
2012070Sbaden   (cond (DynTraceFlg (IncrTimes 'plus$fp)))
2112070Sbaden   (cond ((ok_pair x 'numberp) (plus (car x) (cadr x)))
2212070Sbaden 	(t (bottom))))
2312070Sbaden 
2412070Sbaden ; unit function
2512070Sbaden 
2612070Sbaden (defun (u-fnc plus$fp) nil
2712070Sbaden   0)
2812070Sbaden 
2912070Sbaden ; fp subtraction
3012070Sbaden 
3112070Sbaden (defun sub$fp (x)
3212070Sbaden   (cond (DynTraceFlg (IncrTimes 'sub$fp)))
3312070Sbaden   (cond ((ok_pair x 'numberp) (diff (car x) (cadr x)))
3412070Sbaden 	(t (bottom))))
3512070Sbaden 
3612070Sbaden 
3712070Sbaden ; unit function
3812070Sbaden 
3912070Sbaden (defun (u-fnc sub$fp) nil
4012070Sbaden   0)
4112070Sbaden 
4212070Sbaden ; fp multiplication
4312070Sbaden 
4412070Sbaden (defun times$fp (x)
4512070Sbaden   (cond (DynTraceFlg (IncrTimes 'times$fp)))
4612070Sbaden   (cond ((ok_pair x 'numberp) (product (car x) (cadr x)))
4712070Sbaden 	(t (bottom))))
4812070Sbaden 
4912070Sbaden ; unit function
5012070Sbaden 
5112070Sbaden (defun (u-fnc times$fp) nil
5212070Sbaden   1)
5312070Sbaden 
5412070Sbaden 
5512070Sbaden ; fp division
5612070Sbaden 
5712070Sbaden (defun div$fp (x)
5812070Sbaden   (cond (DynTraceFlg (IncrTimes 'div$fp)))
5912070Sbaden   (cond ((ok_pair x 'numberp)
6012070Sbaden 	 (cond ((not (zerop (cadr x)))
6112070Sbaden 		(quotient (car x) (cadr x)))
6212070Sbaden 	       (t (bottom))))
6312070Sbaden 	(t (bottom))))
6412070Sbaden 
6512070Sbaden ; unit function
6612070Sbaden 
6712070Sbaden (defun (u-fnc div$fp) nil
6812070Sbaden   1)
6912070Sbaden 
7012070Sbaden 
7112070Sbaden 
7212070Sbaden ; logical functions, and or xor not
7312070Sbaden 
7412070Sbaden (defun and$fp (x)
7512070Sbaden   (cond (DynTraceFlg (IncrTimes 'and$fp)))
7612070Sbaden   (cond ((ok_pair x 'boolp)
7712070Sbaden 	 (cond
7812070Sbaden 	  ((eq 'F (car x)) 'F)
7912070Sbaden 	  (t (cadr x))))
8012070Sbaden 	(t (bottom))))
8112070Sbaden 
8212070Sbaden ; unit function
8312070Sbaden 
8412070Sbaden (defun (u-fnc and$fp) nil
8512070Sbaden   'T)
8612070Sbaden 
8712070Sbaden 
8812070Sbaden (defun or$fp (x)
8912070Sbaden   (cond (DynTraceFlg (IncrTimes 'or$fp)))
9012070Sbaden   (cond ((ok_pair x 'boolp)
9112070Sbaden 	 (cond
9212070Sbaden 	  ((eq 'T (car x)) 'T)
9312070Sbaden 	  (t (cadr x))))
9412070Sbaden 	(t (bottom))))
9512070Sbaden 
9612070Sbaden ; unit function
9712070Sbaden 
9812070Sbaden (defun (u-fnc or$fp) nil
9912070Sbaden   'F)
10012070Sbaden 
10112070Sbaden 
10212070Sbaden (defun xor$fp (x)
10312070Sbaden   (cond (DynTraceFlg (IncrTimes 'xor$fp)))
10412070Sbaden   (cond ((ok_pair x 'boolp)
10512070Sbaden 	 (let ((p (car x))
10612070Sbaden 	       (q (cadr x)))
10712070Sbaden 	      (cond ((or (and (eq p 'T) (eq q 'T))
10812070Sbaden 			 (and (eq p 'F) (eq q 'F)))
10912070Sbaden 		     'F)
11012070Sbaden 		    (t 'T))))
11112070Sbaden 	(t (bottom))))
11212070Sbaden 
11312070Sbaden ; unit function
11412070Sbaden 
11512070Sbaden (defun (u-fnc xor$fp) nil
11612070Sbaden   'F)
11712070Sbaden 
11812070Sbaden 
11912070Sbaden (defun not$fp (x)
12012070Sbaden   (cond (DynTraceFlg (IncrTimes 'not$fp)))
12112070Sbaden   (cond ((not (atom x)) (bottom))
12212070Sbaden 	((boolp x) (cond ((eq x 'T) 'F) (t 'T)))
12312070Sbaden 	(t (bottom))))
12412070Sbaden 
12512070Sbaden 
12612070Sbaden ; relational operators,  <  <=  =  >=  >  ~=
12712070Sbaden 
12812070Sbaden (defun lt$fp (x)
12912070Sbaden   (cond (DynTraceFlg (IncrTimes 'lt$fp)))
13012070Sbaden   (cond ((ok_pair x 'numberp)
13112070Sbaden 	 (cond ((lessp (car x) (cadr x)) 'T)
13212070Sbaden 	       (t 'F)))
13312070Sbaden 	(t (bottom))))
13412070Sbaden 
13512070Sbaden (defun le$fp (x)
13612070Sbaden   (cond (DynTraceFlg (IncrTimes 'le$fp)))
13712070Sbaden   (cond ((ok_pair x 'numberp)
13812070Sbaden 	 (cond ((not (greaterp (car x) (cadr x))) 'T)
13912070Sbaden 	       (t 'F)))
14012070Sbaden 	(t (bottom))))
14112070Sbaden 
14212070Sbaden (defun eq$fp (x)
14312070Sbaden   (cond (DynTraceFlg (IncrTimes 'eq$fp)))
14412070Sbaden   (cond ((ok_eqpair x )
14512070Sbaden 	 (cond ((equal  (car x) (cadr x)) 'T)
14612070Sbaden 	       (t 'F)))
14712070Sbaden 	(t (bottom))))
14812070Sbaden 
14912070Sbaden (defun ge$fp (x)
15012070Sbaden   (cond (DynTraceFlg (IncrTimes 'ge$fp)))
15112070Sbaden   (cond ((ok_pair x 'numberp)
15212070Sbaden 	 (cond ((not (lessp (car x) (cadr x))) 'T)
15312070Sbaden 	       (t 'F)))
15412070Sbaden 	(t (bottom))))
15512070Sbaden 
15612070Sbaden (defun gt$fp (x)
15712070Sbaden   (cond (DynTraceFlg (IncrTimes 'gt$fp)))
15812070Sbaden   (cond ((ok_pair x 'numberp)
15912070Sbaden 	 (cond ((greaterp (car x) (cadr x)) 'T)
16012070Sbaden 	       (t 'F)))
16112070Sbaden 	(t (bottom))))
16212070Sbaden 
16312070Sbaden (defun ne$fp (x)
16412070Sbaden   (cond (DynTraceFlg (IncrTimes 'ne$fp)))
16512070Sbaden   (cond ((ok_eqpair x)
16612070Sbaden 	 (cond ((not (equal  (car x) (cadr x))) 'T)
16712070Sbaden 	       (t 'F)))
16812070Sbaden 	(t (bottom))))
16912070Sbaden 
17012070Sbaden 
17112070Sbaden 
17212070Sbaden ; check arguments for eq and ne
17312070Sbaden 
17412070Sbaden (defun ok_eqpair (x)
17512070Sbaden   (cond ((not (atom x))
17612070Sbaden 	 (cond ((eq (length x) 2) t)))))
17712070Sbaden 
17812070Sbaden ; check arguments for binary arithmetics/logicals
17912070Sbaden 
18012070Sbaden (defun ok_pair (x typ)
18112070Sbaden   (cond ((not (atom x))
18212070Sbaden 	 (cond ((eq (length x) 2)
18312070Sbaden 		(cond
18412070Sbaden 		 ((and (atom (car x)) (atom (cadr x)))
18512070Sbaden 		  (cond ((and (funcall typ (car x))
18612070Sbaden 			      (funcall typ (cadr x))) t)))))))))
18712070Sbaden 
18812070Sbaden ; check if a variable is boolean, 'T' or 'F'
18912070Sbaden 
19012070Sbaden (defun boolp (x)
19112070Sbaden   (memq x '(T F)))
19212070Sbaden 
19312070Sbaden 
19412070Sbaden (defun undefp (x)
19512070Sbaden   (eq x '?))
19612070Sbaden 
19712070Sbaden (defun tl$fp (x)
19812070Sbaden   (cond (DynTraceFlg (IncrSize 'tl$fp (size x)) (IncrTimes 'tl$fp)))
19912070Sbaden   (cond ((atom x) (bottom))
20012070Sbaden 	(t (cdr x))))
20112070Sbaden 
20212070Sbaden 
20312070Sbaden (defun tlr$fp (x)
20412070Sbaden   (cond (DynTraceFlg (IncrSize 'tlr$fp (size x)) (IncrTimes 'tlr$fp)))
20512070Sbaden   (cond ((listp x) (cond
20612070Sbaden 		    ((onep (length x)) nil)
20712070Sbaden 		    (t (reverse (cdr (reverse x))))))
20812070Sbaden 	(t (bottom))))
20912070Sbaden 
21012070Sbaden ; this function is just like id$fp execept it also prints its
21112070Sbaden ; argument on the stdout. It is meant to be used only for debuging.
21212070Sbaden 
21312070Sbaden (defun out$fp (x)
21412070Sbaden   (fpPP x)
21512070Sbaden   (terpri)
21612070Sbaden   x)
21712070Sbaden 
21812070Sbaden (defun id$fp (x)
21912070Sbaden   (cond (DynTraceFlg (IncrSize 'id$fp (size x)) (IncrTimes 'id$fp)))
22012070Sbaden   x)
22112070Sbaden 
22212070Sbaden (defun atom$fp (x)
22312070Sbaden   (cond (DynTraceFlg (IncrSize 'atom$fp (size x)) (IncrTimes 'atom$fp)))
22412070Sbaden   (cond ((atom x) 'T)
22512070Sbaden 	(t 'F)))
22612070Sbaden 
22712070Sbaden (defun null$fp (x)
22812070Sbaden   (cond (DynTraceFlg (IncrSize 'null$fp (size x)) (IncrTimes 'null$fp)))
22912070Sbaden   (cond ((null x) 'T)
23012070Sbaden 	(t  'F)))
23112070Sbaden 
23212070Sbaden (defun reverse$fp (x)
23312070Sbaden   (cond (DynTraceFlg (IncrSize 'reverse$fp (size x)) (IncrTimes 'reverse$fp)))
23412070Sbaden   (cond  ((null x) x)
23512070Sbaden 	 ((listp x) (reverse x))
23612070Sbaden 	 (t (bottom))))
23712070Sbaden 
23812070Sbaden (defun lpair$ (x)
23912070Sbaden   (cond ((or (undefp x) (not (listp x))) nil)
24012070Sbaden 	(t
24112070Sbaden 	 (setq y_l (car x))
24212070Sbaden 	 (setq z_l (cdr x))
24312070Sbaden 	 (cond ((null z_l)  t)
24412070Sbaden 	       (t (cond ((or (not (listp z_l)) (not (onep (length z_l)))) nil)
24512070Sbaden 			(t (listp (setq z_l (car z_l))))))))))
24612070Sbaden 
24712070Sbaden (defun rpair$ (x)
24812070Sbaden   (cond ((or (undefp x) (not (listp x))) nil)
24912070Sbaden 	(t
25012070Sbaden 	 (setq y_l (car x))
25112070Sbaden 	 (setq z_l (cdr x))
25212070Sbaden 	 (cond ((null y_l)  t)
25312070Sbaden 	       (t (cond ((not (listp y_l)) nil)
25412070Sbaden 			(t (setq z_l (car z_l)) t)))))))
25512070Sbaden 
25612070Sbaden 
25712070Sbaden (defun distl$fp (x)
25812070Sbaden   (let ((y_l nil) (z_l nil))
25912070Sbaden        (cond ((lpair$ x)
26012070Sbaden 	      (cond (DynTraceFlg
26112070Sbaden 		     (IncrSize 'distl$fp (size z_l)) (IncrTimes 'distl$fp)))
26212070Sbaden 	      (mapcar '(lambda (u) (list y_l u)) z_l))
26312070Sbaden 	     (t (bottom)))))
26412070Sbaden 
26512070Sbaden (defun distr$fp (x)
26612070Sbaden   (let ((y_l nil) (z_l nil))
26712070Sbaden        (cond ((rpair$ x)
26812070Sbaden 	      (cond (DynTraceFlg
26912070Sbaden 		     (IncrSize 'distr$fp (size y_l)) (IncrTimes 'distr$fp)))
27012070Sbaden 	      (mapcar '(lambda (u) (list u z_l)) y_l))
27112070Sbaden 	     (t (bottom)))))
27212070Sbaden 
27312070Sbaden 
27412070Sbaden (defun length$fp (x)
27512070Sbaden   (cond (DynTraceFlg (IncrSize 'length$fp (size x)) (IncrTimes 'length$fp)))
27612070Sbaden   (cond ((listp x) (length x))
27712070Sbaden 	(t (bottom))))
27812070Sbaden 
27912070Sbaden (defun apndl$fp (x)
28012070Sbaden   (cond ((and (dtpr x) (eq 2 (length x)) (listp (cadr x)))
28112070Sbaden 	 (cond (DynTraceFlg
28212070Sbaden 		(IncrSize 'apndl$fp (size (cadr x))) (IncrTimes 'apndl$fp)))
28312070Sbaden 	 (cons (car x) (cadr x)))
28412070Sbaden 	(t (bottom))))
28512070Sbaden 
28612070Sbaden 
28712070Sbaden (defun apndr$fp (x)
28812070Sbaden   (cond ((and (dtpr x) (eq 2 (length x)) (listp (car x)))
28912070Sbaden 	 (cond (DynTraceFlg
29012070Sbaden 		(IncrSize 'apndr$fp (size (car x))) (IncrTimes 'apndr$fp)))
29112070Sbaden 	 (append (car x) (cdr x)))
29212070Sbaden 	(t (bottom))))
29312070Sbaden 
29412070Sbaden 
29512070Sbaden (defun rotl$fp (x)
29612070Sbaden   (cond (DynTraceFlg (IncrSize 'rotl$fp (size x)) (IncrTimes 'rotl$fp)))
29712070Sbaden   (cond ((null x) x)
29812070Sbaden 	((listp x) (cond ((onep (length x)) x)
29912070Sbaden 			 (t (append (cdr x) (list (car x))))))
30012070Sbaden 	(t (bottom))))
30112070Sbaden 
30212070Sbaden (defun rotr$fp (x)
30312070Sbaden   (cond (DynTraceFlg (IncrSize 'rotr$fp (size x)) (IncrTimes 'rotr$fp)))
30412070Sbaden   (cond ((null x) x)
30512070Sbaden 	((listp x) (cond ((onep (length x)) x)
30612070Sbaden 			 (t (reverse (rotl$fp (reverse x))))))
30712070Sbaden 	(t (bottom))))
30812070Sbaden 
30912070Sbaden 
31012070Sbaden (defun trans$fp (x)
31112092Sbaden   (If (and (listp x) (allLists x))
31212070Sbaden       then (If (allNulls x)
31312070Sbaden 	       then
31412070Sbaden 	       (cond (DynTraceFlg
31512070Sbaden 		      (IncrSize 'trans$fp (size x))
31612070Sbaden 		      (IncrTimes 'trans$fp)))
31712070Sbaden 	       nil
31812070Sbaden 
31912070Sbaden 	       else
32012070Sbaden 	       (cond (DynTraceFlg
32112070Sbaden 		      (IncrSize 'trans$fp
32212070Sbaden 				(+ (size (car x))
32312070Sbaden 				   (size (cadr x)))) (IncrTimes 'trans$fp)))
32412070Sbaden 
32512070Sbaden 	       (do ((a x (cdr a))
32612070Sbaden 		    (f (length (car x))))
32712070Sbaden 		   ((null a) (trnspz x))
32812070Sbaden 		   (If (or (not (listp (car a))) (not (eq f (length (car a)))))
32912070Sbaden 		       then (bottom))))
33012070Sbaden       else
33112070Sbaden 
33212070Sbaden       (bottom)))
33312070Sbaden 
33412070Sbaden (defun allNulls (x)
33512070Sbaden   (do ((a x (cdr a)))
33612070Sbaden       ((null a) t)
33712070Sbaden       (If (car a) then (return nil))))
33812070Sbaden 
33912092Sbaden (defun allLists (x)
34012092Sbaden   (do ((a x (cdr a)))
34112092Sbaden       ((null a) t)
34212092Sbaden       (If (not (dtpr (car a))) then (return nil))))
34312070Sbaden 
34412092Sbaden 
34512070Sbaden (defun trnspz (l)
34612070Sbaden   (do
34712070Sbaden    ((h (emptyHeader (length (car l))))
34812070Sbaden     (v l (cdr v)))
34912070Sbaden    ((null v) (mapcar 'car h))
35012070Sbaden    (mapcar #'(lambda (x y) (tconc x y)) h (car v))))
35112070Sbaden 
35212070Sbaden 
35312070Sbaden (defun emptyHeader (n)
35412070Sbaden   (do
35512070Sbaden    ((r nil)
35612070Sbaden     (c n (1- c)))
35712070Sbaden    ((= c 0) r)
35812070Sbaden    (setq r (cons (ncons nil) r))))
35912070Sbaden 
36012070Sbaden 
36112070Sbaden (defun iota$fp (x)
36212070Sbaden   (cond (DynTraceFlg  (IncrTimes 'iota$fp)))
36312070Sbaden   (cond ((undefp x) x)
36412070Sbaden 	((listp x) (bottom))
36512070Sbaden 	((not (fixp x)) (bottom))
36612070Sbaden 	((lessp x 0) (bottom))
36712070Sbaden 	((zerop x) nil)
36812070Sbaden 	(t
36912070Sbaden 	 (do ((z x (1- z))
37012070Sbaden 	      (rslt nil))
37112070Sbaden 	     ((zerop z) rslt)
37212070Sbaden 	     (setq rslt (cons z rslt))))))
37312070Sbaden 
37412070Sbaden ; this is the stuff that was added by dorab patel to make this have
37512070Sbaden ; the same functions as David Lahti's interpreter
37612070Sbaden 
37712070Sbaden 
37812070Sbaden ;; Modified by SBB to accept nil as a valid input
37912070Sbaden 
38012070Sbaden (defun last$fp (x)
38112070Sbaden   (cond (DynTraceFlg (IncrSize 'last$fp (size x)) (IncrTimes 'last$fp)))
38212070Sbaden     (cond ((null x) nil)
38312070Sbaden 	  ((listp x) (car (last x)))
38412070Sbaden 	  (t (bottom))))
38512070Sbaden 
38612070Sbaden ;; Added by SBB
38712070Sbaden 
38812070Sbaden (defun first$fp (x)
38912070Sbaden   (If DynTraceFlg then (IncrSize 'first$fp (size x)) (IncrTimes 'first$fp))
39012070Sbaden   (If (not (listp x)) then (bottom)
39112070Sbaden       else (car x)))
39212070Sbaden 
39312070Sbaden (defun front$fp (x)
39412070Sbaden   (cond (DynTraceFlg (IncrSize 'front$fp (size x)) (IncrTimes 'front$fp)))
39512070Sbaden     (cond ((null x) (bottom))
39612092Sbaden 	  ((listp x) (reverse (cdr (reverse x))))
39712070Sbaden 	  (t (bottom))))
39812070Sbaden 
39912070Sbaden (defun pick$fp (sAndX)
40012070Sbaden   (let ((s (car sAndX))
40112070Sbaden 	(x (cadr sAndX)))
40212834Sbaden        (If (or (not (fixp s)) (zerop s) (cddr sAndX)) then  (bottom)
40312070Sbaden 	   else
40412070Sbaden 
40512070Sbaden 	   (progn
40612070Sbaden 	    (cond (DynTraceFlg
40712070Sbaden 		   (IncrTimes 'select$fp)
40812070Sbaden 		   (IncrSize 'select$fp (size x))))
40912070Sbaden 
41012070Sbaden 	    (cond ((not (listp x)) (bottom))
41112070Sbaden 		  ((plusp s)
41212070Sbaden 		   (If (greaterp s (length x)) then (bottom)
41312070Sbaden 		       else (nthelem s x)))
41412070Sbaden 		  ((minusp s)
41512070Sbaden 		   (let  ((len (length x)))
41612070Sbaden 			 (If (greaterp (absval s) len) then (bottom)
41712070Sbaden 			     else (nthelem (plus len 1 s) x)))))))))
41812070Sbaden 
41912070Sbaden 
42012070Sbaden (defun concat$fp (x)
42112070Sbaden   (cond (DynTraceFlg (IncrSize 'concat$fp (size x)) (IncrTimes 'concat$fp)))
42212070Sbaden 
42312070Sbaden   (If (listp x)
42412070Sbaden       then
42512070Sbaden       (do ((a x  (cdr a))
42612070Sbaden 	   (y (copy x) (cdr y))
42712070Sbaden 	   (rslt (ncons nil)))
42812070Sbaden 	  ((null a) (car rslt))
42912070Sbaden 	  (If (not (listp (car a))) then (bottom))
43012070Sbaden 
43112070Sbaden 	  (lconc rslt (car y)))
43212070Sbaden 
43312070Sbaden       else (bottom)))
43412070Sbaden 
43512070Sbaden 
43612070Sbaden (defun pair$fp (x)
43712070Sbaden   (cond (DynTraceFlg (IncrSize 'pair$fp (size x)) (IncrTimes 'pair$fp)))
43812092Sbaden   (cond ((not (listp x)) (bottom))
43912092Sbaden 	((null x) (bottom))
44012092Sbaden 	(t (do ((count 0 (add count 2)) ; set local vars
44112092Sbaden 		(max (length x))
44212092Sbaden 		(ret (ncons nil)))
44312092Sbaden 	       ((not (lessp count max)) (car ret)) ; return car of tconc struc
44412092Sbaden 	       (cond ((equal (diff max count) 1) ; if only one element left
44512092Sbaden 		      (tconc ret (list (car x))))
44612092Sbaden 		     (t (tconc ret (list (car x) (cadr x)))
44712092Sbaden 			(setq x (cddr x))))))))
44812070Sbaden 
44912070Sbaden 
45012070Sbaden (defun split$fp (x)
45112070Sbaden   (cond (DynTraceFlg (IncrSize 'split$fp (size x)) (IncrTimes 'split$fp)))
45212070Sbaden   (cond ((not (listp x)) (bottom))
45312070Sbaden 	((null x) (bottom))
45412070Sbaden 	((eq (length x) 1) (list x nil))
45512070Sbaden 	(t
45612070Sbaden 	 (do ((count 1 (add1 count))
45712070Sbaden 	      (mid (fix (plus 0.5 (quotient (length x) 2.0))))
45812070Sbaden 	      (ret nil))
45912070Sbaden 	     ((greaterp count mid) (cons (nreverse ret) (list x)))
46012070Sbaden 	     (setq ret (cons (car x) ret))
46112070Sbaden 	     (setq x (cdr x))))))
46212070Sbaden 
46312070Sbaden 
46412070Sbaden ; Library functions: sin, asin, cos, acos, log, exp, mod
46512070Sbaden 
46612070Sbaden (defun sin$fp (x)
46712070Sbaden   (cond (DynTraceFlg  (IncrTimes 'sin$fp)))
46812070Sbaden   (cond ((numberp x) (sin x))
46912070Sbaden 	(t (bottom))))
47012070Sbaden 
47112070Sbaden (defun asin$fp (x)
47212070Sbaden   (cond (DynTraceFlg  (IncrTimes 'asin$fp)))
47312070Sbaden   (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (asin x))
47412070Sbaden 	(t (bottom))))
47512070Sbaden 
47612070Sbaden (defun cos$fp (x)
47712070Sbaden   (cond (DynTraceFlg  (IncrTimes 'cos$fp)))
47812070Sbaden   (cond ((numberp x) (cos x))
47912070Sbaden 	(t (bottom))))
48012070Sbaden 
48112070Sbaden (defun acos$fp (x)
48212070Sbaden   (cond (DynTraceFlg  (IncrTimes 'acos$fp)))
48312070Sbaden   (cond ((and (numberp x) (not (greaterp (abs x) 1.0))) (acos x))
48412070Sbaden 	(t (bottom))))
48512070Sbaden 
48612070Sbaden (defun log$fp (x)
48712070Sbaden   (cond (DynTraceFlg  (IncrTimes 'log$fp)))
48812070Sbaden   (cond ((and (numberp x) (not (minusp x))) (log x))
48912070Sbaden 	(t (bottom))))
49012070Sbaden 
49112070Sbaden (defun exp$fp (x)
49212070Sbaden   (cond (DynTraceFlg  (IncrTimes 'exp$fp)))
49312070Sbaden   (cond ((numberp x) (exp x))
49412070Sbaden 	(t (bottom))))
49512070Sbaden 
49612070Sbaden (defun mod$fp (x)
49712070Sbaden   (cond (DynTraceFlg  (IncrTimes 'mod$fp)))
49812070Sbaden   (cond ((ok_pair x 'numberp) (mod (car x) (cadr x)))
49912070Sbaden 	(t (bottom))))
50012070Sbaden 
50112070Sbaden 
50212070Sbaden ;; Tree insert function
50312070Sbaden 
50412070Sbaden 
50512070Sbaden (defun treeIns$fp (fn x)
50612070Sbaden   (If (not (listp x)) then  (bottom)
50712070Sbaden       else
50812070Sbaden       (If (null x) then  (unitTreeInsert fn)
50912070Sbaden 	  else
51012070Sbaden 	  (let ((len (length x)))
51112070Sbaden 	       (If (onep len) then (car x)
51212070Sbaden 		   else
51312070Sbaden 		   (If (twop len) then (funcall fn x )
51412070Sbaden 		       else (treeInsWithLen fn x len)))))))
51512070Sbaden 
51612070Sbaden 
51712070Sbaden (defun treeInsWithLen (fn x len)
51812070Sbaden   (let* ((r1 (copy x))
51912070Sbaden 	 (nLen (fix (plus 0.5 (quotient len 2.0))))
52012070Sbaden 	 (p (Cnth r1 nLen))
52112070Sbaden 	 (r2 (cdr p)))
52212070Sbaden 	(rplacd p nil)
52312070Sbaden 	(let ((saveLevel level))
52412070Sbaden 	     (setq level (1+ level))
52512070Sbaden 	     (let ((R1 (treeIns fn r1 nLen)))
52612070Sbaden 		  (setq level (1+ saveLevel))
52712070Sbaden 		  (let ((R2 (treeIns fn r2 (diff len nLen))))
52812070Sbaden 		       (setq level saveLevel)
52912070Sbaden 		       (funcall fn `(,R1 ,R2)))))))
530