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