|
|
1.1 root 1: ;--- file : complrc.l
2: (include "compmacs.l")
3:
4: (declare (special w-vars w-labs w-ret w-name w-bv w-atmt cm-alv v-cnt))
5: (def $pr$ (macro (x) `(patom ,(cadr x) compout)))
6:
7: (def put
8: (macro (x)
9: ((lambda (atm prp arg)
10: `(progn (putprop ,atm ,arg ,prp) ,atm))
11: (cadr x) (caddr x) (cadddr x))))
12:
13: (def f-if
14: (lambda (v-l v-r v-j v-t)
15: (cond ((eq (caar v-l) 't)
16: (cond ((null (cdar v-l)) (f-exp t v-r v-t))
17: (t (f-seq (cdar v-l) v-r v-t))))
18: (t (prog (v-tr v-i v-dv)
19: (setq v-tr (f-reg nil))
20: (setq v-dv 'amb)
21: (cond ((null (cdr v-l))
22: (setq v-tr v-r)
23: (cond ((null (cdar v-l)) (go loop2)))
24: (setq v-dv nil)
25: (setq v-i (cadr v-j)))
26: ((null (cdar v-l))
27: (setq v-tr v-r)
28: (setq v-t (f-if (cdr v-l) v-r v-j v-t))
29: (setq v-t (f-addi (list 'true (cadr v-j) t)
30: v-t))
31: (go loop1))
32: (t (setq v-t (f-leap (f-if (cdr v-l)
33: v-r
34: v-j
35: v-t)))
36: (setq v-t (f-addi v-j v-t))
37: (setq v-i (cadr s-inst))))
38: (setq v-t (f-seq (cdar v-l) v-r v-t))
39: (setq v-t (f-addi (list 'false v-i v-dv) v-t))
40: loop1
41: (setq v-t (f-addi (list 'minus (f-use v-tr) nil) v-t))
42: loop2
43: (return (f-exp (caar v-l) v-tr v-t)))))))
44: ;--- f-seqp - v-l : sequence of s-expressions and labels to evaluate
45: ; - v-r : psreg in which to store the final result
46: ; - v-t : tail.
47: ; This will do the top level of prog bodies
48: ;
49: (def f-seqp
50: (lambda (v-l v-r v-t)
51: (do ((l (reverse v-l) (cdr l))
52: (newreg v-r)
53: (reg v-r newreg))
54: ((null l) v-t)
55: (cond ((symbolp (car l))
56: (setq v-t (f-labl v-t (car l))))
57: (t (setq v-t (f-exp (car l) reg v-t))
58: (setq newreg (Gensym nil)))))))
59:
60: ;--- f-seq - v-l : sequence of s-expressions to evaluate
61: ; - v-r : psreg in which to store the final result
62: ; - v-t : tail
63: ;
64: ; This generates intermediate codes to calculate the s-expressions
65: ; in v-l. This does not look for labels.
66: ;
67: (def f-seq
68: (lambda (v-l v-r v-t)
69: (do ((l (reverse v-l) (cdr l))
70: (reg v-r (Gensym nil)))
71: ((null l) v-t)
72: (setq v-t (f-exp (car l) reg v-t)))))
73:
74: ;--- f-pusha - v-l : list of forms to evaluate and push on stack
75: ; - v-r : register to place result of last expr in
76: ; - v-t : tail
77: ; emits code to to evaluate and push forms on the stack.
78: (def f-pusha
79: (lambda (v-l v-r v-t)
80: (cond ((null v-l) v-t)
81: (t (do ((ll (reverse v-l) (cdr ll))
82: (reg v-r (Gensym nil))
83: (res v-t
84: (f-exp (car ll)
85: reg
86: (f-addi `(push ,(f-use reg)) res))))
87: ((null ll) res))))))
88:
89: ;--- f-iter - v-e : list of expression to evaluate
90: ; - v-v : list of variables those expressions will be bound to
91: ; This checks of the given expressions can be bound to the given
92: ; variables with no conflicts. This is determining if tail
93: ; merging is possible were we replace recursion by iteration.
94: ;
95: (def f-iter
96: (lambda (v-e v-v)
97: (prog (v-y w-vars)
98:
99: loop
100: (cond ((null v-e) (return t))
101: ((null v-v) (go bad))
102: ((ifflag (setq v-y (car v-v)) x-spec) (go bad))
103: ((equal (car v-e) v-y) (go usable))
104: (t (go check)))
105: next
106: (setq w-vars (cons v-y w-vars))
107: usable
108: (setq v-e (cdr v-e))
109: (setq v-v (cdr v-v))
110: (go loop)
111: check
112: (cond ((f-nice (car v-e)) (go next)))
113: bad
114: (return nil))))
115:
116: (def f-nice
117: (lambda (v-e)
118: (cond ((atom v-e) (not (member v-e w-vars)))
119: ((atom (car v-e))
120: (cond ((eq (car v-e) 'quote) t)
121: ((ifflag (car v-e) x-dont) nil)
122: (t (f-all v-e 'f-nice))))
123: (t (f-all v-e 'f-nice)))))
124:
125: ;--- f-all - v-l : list
126: ; - v-f : function
127: ; mapc function v-f over v-l as long as the result is non nil
128: ;
129: (def f-all
130: (lambda (v-l v-f)
131: (cond ((null v-l) t)
132: ((funcall v-f (car v-l)) (f-all (cdr v-l) v-f))
133: (t nil))))
134:
135: (def f-make
136: (lambda (v-r v-v)
137: (put v-r x-reg v-v)))
138:
139: ;--- f-leap - v-t : tail
140: ; We generate and place in global variable s-inst an itermediate
141: ; instructin which will jump to the current top location in v-t.
142: ; If there is not a label on top of v-t, one is added.
143: ;
144: (def f-leap
145: (lambda (v-t)
146: (cond ((not (setq s-inst (get (caar v-t) x-leap)))
147: (setq v-t (f-labl v-t nil))
148: (setq s-inst 'go)))
149: (setq s-inst (list s-inst (cadar v-t)))
150: v-t))
151:
152: ;--- f-labl - v-t : tail
153: ; - v-l : real label or nil
154: ; We insure that there is a label on top of v-t. If not we
155: ; create one. If we are given a label, we associate it with
156: ; a created label.
157: ; Labels in v-t are all gensymed and the association is all
158: ; on the property list of the value of w-labs.
159: ; Errors: duplicate labels
160: ;
161: (def f-labl
162: (lambda (v-t v-l)
163: (prog (v-i)
164: (cond ((eq (caar v-t) 'label)
165: (cond (v-l (cond ((setq v-i (get w-labs v-l)))
166: (t (put w-labs v-l (cadar v-t))
167: (return v-t))))
168: (t (return v-t))))
169:
170: ((null v-l) (setq v-i (Gensym nil)))
171: ((setq v-i (get w-labs v-l)))
172: (t (put w-labs v-l (setq v-i (Gensym nil)))))
173: (return (f-addi (list 'label v-i) v-t)))))
174:
175: (def f-test
176: (lambda (v-t)
177: (and (eq (caar v-t) 'minus)
178: (null (caddar v-t)))))
179:
180: (def f-vble
181: (lambda (v-v v-r)
182: (f-use v-r)
183: (cond ((not (symbolp v-v)) v-v)
184: ((null v-v) nil)
185: ((f-con v-v) v-v)
186: ((ifflag v-v x-spec) v-v)
187: ((member v-v w-vars) v-v)
188: (t (setq k-free (cons v-v k-free))
189: (flag v-v x-spec)))))
190:
191: (def f-addi
192: (lambda (v-i v-t)
193: (prog (v-o)
194: (cond ((not (setq v-o (get (car v-i) x-opt))) (go normal))
195: ((setq v-o (funcall v-o v-i v-t)) (return v-o)))
196: normal
197: (return (cons v-i v-t)))))
198:
199: (def f-reg
200: (lambda (v-f)
201: (cond ((numberp v-f) (put (Gensym nil) x-reg v-f))
202: (v-f (flag (Gensym nil) v-f))
203: (t (Gensym nil)))))
204:
205: (def f-con
206: (lambda (v-v)
207: (cond ((ifflag v-v x-spec) nil)
208: (t (ifflag v-v x-con)))))
209:
210: (def f-one
211: (lambda (v-e)
212: (or (atom v-e)
213: (eq (car v-e) 'quote))))
214:
215: (def f-swap
216: (lambda (v-t)
217: (cond ((eq (caar v-t) 'get) (f-swap (cdr v-t)))
218: (t (rplaca (car v-t)
219: (cond ((eq (caar v-t) 'true) 'false)
220: (t 'true)))))
221: v-t))
222:
223: (def f-xval
224: (lambda (v-t v-r)
225: (cond ((or (eq (caar v-t) 'get)
226: (eq (caddar v-t) 'amb)) v-t)
227: (t (f-addi (list 'get (f-use v-r) (caddar v-t)) v-t)))))
228:
229: ;--- f-use - v-r : psreg whose value is being used
230: ; we keep track of the number of times the value of a register is
231: ; used, the count is kept under the indicator x-count in the
232: ; psreg's property list. the count starts at nil, goes to `used'
233: ; and then to `force'. Once the count goes to `force' all gets
234: ; must be done. when the count is used get should look to see
235: ; if the following intermediate code instruction is the one
236: ; using the register and in that case it can merge with that
237: ; instruction
238: ;
239: (def f-use
240: (lambda (v-r)
241: ((lambda (curv)
242: (cond (curv (cond ((not (eq curv 'force))
243: (putprop v-r 'force 'x-count))))
244: (t (putprop v-r 'used 'x-count)))
245: v-r)
246: (get v-r 'x-count))))
247:
248:
249: (def f-chop
250: (lambda (v-t)
251: (cond ((or (eq (caar v-t) 'label)
252: (eq (caar v-t) 'end)) v-t)
253: (t (f-chop (cdr v-t))))))
254:
255: (def f-tfo
256: (lambda (v-i v-t)
257: (cond ((not (f-like v-t '(go label))) nil)
258: ((not (equal (cadr v-i) (cadadr v-t))) nil)
259: (t (rplaca (cdr v-i) (cadar v-t))
260: (f-swap (rplaca v-t v-i))))))
261:
262: (def f-like
263: (lambda (v-t v-p)
264: (cond ((null v-p) t)
265: ((null v-t) nil)
266: ((equal (caar v-t) (car v-p)) (f-like (cdr v-t) (cdr v-p)))
267: (t nil))))
268:
269: (def f-aor
270: (lambda (v-l v-e v-r v-t)
271: (cond ((null v-l)
272: (f-addi (list 'get (f-use v-r) (eq v-e 'and)) v-t))
273: (t (prog (v-j v-dv v-tr v-tr2)
274: (setq v-dv (eq v-e 'or))
275: (setq v-tr v-r)
276: (setq v-tr2 v-r)
277: (setq v-e
278: (cond ((eq v-e 'and) 'false)
279: (t 'true)))
280: (setq v-l (reverse v-l))
281: (cond ((null (cdr v-l)) (go loop))
282: ((and (f-test v-t)
283: (not (eq (caadr v-t) 'get)))
284: (cond ((eq (caddadr v-t) 'amb)
285: (setq v-dv 'amb)
286: (setq v-tr2 (f-reg nil)))
287: ((not (equal (caddadr v-t) v-dv))
288: (setq v-dv 'amb)))
289: (cond ((equal (caadr v-t) v-e)
290: (setq v-j (cadadr v-t))
291: (go loop)))
292: (rplacd (cdr v-t) (f-leap (cddr v-t))))
293: (t (setq v-t (f-leap v-t))))
294: (setq v-j (cadr s-inst))
295: loop
296: (setq v-t (f-exp (car v-l) v-tr v-t))
297: (setq v-tr v-tr2)
298: (cond ((null (setq v-l (cdr v-l))) (return v-t)))
299: (setq v-t (f-addi (list v-e v-j v-dv) v-t))
300: (setq v-t (f-addi (list 'minus (f-use v-tr) nil) v-t))
301: (go loop))))))
302:
303: (def f-repl
304: (lambda (v-e)
305: (cons (ucar (car v-e)) (cdr v-e))))
306:
307: ;this seems out of date, must change to mapconvert
308: (def f-domap
309: (lambda (v-e)
310: (prog (v-x)
311: (cond ((setq v-x (f-chkf (cadr v-e) 4))
312: (return (list (car v-e)
313: (list 'quote v-x)
314: (caddr v-e))))
315: (t (return v-e))))))
316:
317:
318: ;--- mapconvert - access : function to access parts of lists
319: ; - join : function to join results
320: ; - resu : function to apply to result
321: ; - form : mapping form
322: ; This function converts maps to an equivalent do form.
323: ;
324: (def mapconvert
325: (lambda (access join resu form )
326: (prog (vrbls finvar acc accform compform tmp)
327:
328: (setq finvar (Gensym 'X) ; holds result
329:
330: vrbls (maplist '(lambda (arg)
331: ((lambda (temp)
332: (cond ((or resu (cdr arg))
333: `(,temp ,(car arg)
334: (cdr ,temp)))
335: (t `(,temp
336: (setq ,finvar ,(car arg))
337: (cdr ,temp)))))
338: (Gensym 'X)))
339: (cdr form))
340:
341:
342: acc (mapcar '(lambda (tem)
343: (cond (access `(,access ,(car tem)))
344: (t (car tem))))
345: vrbls)
346:
347: accform (cond ((or (atom (setq tmp (car form)))
348: (null (setq tmp (cmacroexpand tmp)))
349: (not (member (car tmp) '(quote function))))
350: `(funcall ,tmp ,@acc))
351: (t `(,(cadr tmp) ,@acc))))
352: (return
353: `((lambda (,finvar)
354: (do ( ,@vrbls)
355: ((null ,(caar vrbls)))
356: ,(cond (join `(setq ,finvar (,join ,accform ,finvar)))
357: (t accform)))
358: ,(cond (resu `(,resu ,finvar))
359: (t finvar)))
360: nil )))))
361: (putprop 'mapc 'f-mapc 'x-spfm)
362: (def f-mapc
363: (lambda (v-e)
364: (mapconvert 'car nil nil (cdr v-e))))
365:
366: (putprop 'mapcar 'f-mapcar 'x-spfm)
367: (def f-mapcar
368: (lambda (v-e)
369: (mapconvert 'car 'cons 'reverse (cdr v-e))))
370:
371: (putprop 'map 'f-map 'x-spfm)
372: (def f-map
373: (lambda (v-e)
374: (mapconvert nil nil nil (cdr v-e))))
375:
376:
377: (putprop 'maplist 'f-maplist 'x-spfm)
378: (def f-maplist
379: (lambda (v-e)
380: (mapconvert nil 'cons 'reverse (cdr v-e))))
381:
382:
383:
384:
385: (def f-initv
386: (lambda (v-l)
387: (mapcar 'car (car v-l))))
388:
389: (def f-inits
390: (lambda (v-l)
391: (mapcar 'cadr (car v-l))))
392:
393: (def f-repv
394: (lambda (v-l)
395: (prog (v-x)
396: (setq v-l (car v-l))
397: lp
398: (cond ((null v-l) (return (reverse v-x))))
399: (cond ((cddar v-l) (setq v-x (cons (caar v-l) v-x))))
400: (setq v-l (cdr v-l))
401: (go lp))))
402:
403: (def f-reps
404: (lambda (v-l)
405: (prog (v-x v-y)
406: (setq v-l (car v-l))
407: lp
408: (cond ((null v-l) (return (reverse v-x))))
409: (cond ((cddar v-l)
410: (setq v-y (caddar v-l)) (setq v-x (cons v-y v-x))))
411: (setq v-l (cdr v-l))
412: (go lp))))
413:
414: (def f-endtest
415: (lambda (v-l)
416: (caadr v-l)))
417:
418: (def f-endbody
419: (lambda (v-l)
420: (cdadr v-l)))
421:
422: (def f-dobody
423: (lambda (v-l)
424: (cddr v-l)))
425:
426:
427: (putprop 'do 'f-do 'x-spf)
428:
429: (def f-do
430: (lambda (v-l v-r v-t)
431: (prog (v-init v-initv v-rep v-repv v-loop v-outl v-retl)
432: (cond ((and (car v-l) (atom (car v-l))) ; look for old do
433: (setq v-l (olddo-to-newdo v-l))))
434: (setq v-initv (f-initv v-l)
435: v-init (f-inits v-l)
436: v-repv (f-repv v-l)
437: v-rep (f-reps v-l)
438: v-retl (Gensym nil)
439: v-loop (Gensym nil)
440: v-outl (Gensym nil))
441: (w-save)
442: (return
443: (f-pusha v-init v-r
444: (prog (w-ret w-labs tmp)
445: (setq w-ret `(,v-r . (go ,v-retl)))
446: (setq w-labs (Gensym nil))
447: (setq tmp
448: `((begin ,(length v-initv))
449: ,@(mapcar '(lambda (arg) (setq w-locs
450: (cons arg w-locs))
451: `(bind ,arg))
452: v-initv)
453: (label ,v-loop)
454: ,@(f-exp (f-endtest v-l) v-r
455: `((minus ,v-r nil)
456: (true ,v-outl nil)
457: ,@(f-seqp (f-dobody v-l) v-r
458: (f-pusha v-rep v-r
459: `((dopop ,v-repv)
460: (go ,v-loop)
461: (label ,v-outl)
462: ,@(f-seq (f-endbody v-l) v-r
463: `((end ,v-retl)
464: ,@v-t)))))))))
465: (w-unsave)
466: (return tmp)))))))
467:
468: (def olddo-to-newdo
469: (lambda (v-l)
470: `(((,(car v-l) ,(cadr v-l) ,(caddr v-l)))
471: (,(cadddr v-l) nil)
472: ,@(cddddr v-l))))
473:
474: (putprop 'cond 'f-cond 'x-spf)
475:
476: (def f-cond
477: (lambda (v-l v-r v-t)
478: (setq v-t (f-leap v-t))
479: (f-if v-l v-r s-inst v-t)))
480:
481: (putprop 'quote 'f-quote 'x-spf)
482:
483: (def f-quote
484: (lambda (v-l v-r v-t)
485: (f-addi (list 'get v-r (cons 'quote v-l)) v-t)))
486:
487: (putprop 'prog 'f-prog 'x-spf)
488:
489:
490:
491:
492: (putprop 'setq 'f-setq 'x-spf)
493:
494: (def f-setq
495: (lambda (v-l v-r v-t)
496: (cond ((null (car v-l)) v-t))
497: (do ((ll (reverse v-l) (cddr ll))
498: (reg v-r (Gensym nil)))
499: ((null ll) v-t)
500: (setq v-t (f-exp (car ll)
501: reg
502: `((set ,(f-use reg) ,(g-specialchk (cadr ll)))
503: ,@v-t))))))
504:
505:
506: (putprop 'rplaca 'f-rplaca 'x-spf)
507:
508:
509: (def f-rplaca
510: (lambda (v-l v-r v-t)
511: (cond ((f-one (cadr v-l))
512: (f-exp (car v-l)
513: v-r
514: (f-exp (cadr v-l)
515: (setq v-l (Gensym nil))
516: (f-addi (list 'seta (f-use v-r) (f-use v-l))
517: v-t))))
518: (t (f-pusha v-l
519: (Gensym nil)
520: (f-addi (list 'setas v-r) v-t))))))
521:
522: (putprop 'rplacd 'f-rplacd 'x-spf)
523:
524:
525: (def f-rplacd
526: (lambda (v-l v-r v-t)
527: (cond ((f-one (cadr v-l))
528: (f-exp (car v-l)
529: v-r
530: (f-exp (cadr v-l)
531: (setq v-l (Gensym nil))
532: (f-addi (list 'setd (f-use v-r) (f-use v-l)) v-t))))
533: (t (f-pusha v-l
534: (Gensym nil)
535: (f-addi (list 'setds (f-use v-r)) v-t))))))
536:
537: (putprop 'go 'f-go 'x-spf)
538:
539: ;--- f-go - v-l : label to go to
540: ; - v-r : not used
541: ; - v-t : tail
542: ; We allow non local go to's, however the goto must go no further than the
543: ; first inclosing prog.
544: ; f-go works by finding the w-labs associated with the first enclosing prog,
545: ; and keeping track of the number of binding levels which must be traversed
546: ; to get to that prog.o
547: ; when it finds the correct w-labs, it checks if this label has been seen yet,
548: ; if not iit assigns it a gensymed symbol.
549: ; if a binding level must be traversed, we eimit
550: ; (unbind n) n is number of binding levels to traverse,
551: ; 0 means current level only.
552: ; (go gensymedlabl)
553: ;
554: ; if this is a local goto only the (go gensymedlabl) will be emitted.
555: ;
556: (def f-go
557: (lambda (v-l v-r v-t)
558: (prog (use-labs levels)
559: (setq v-l (car v-l))
560: (setq use-labs
561: (cond (w-ret w-labs)
562: (t (do ((ll w-save (cdr ll))
563: (count 0 (add1 count)))
564: ((null ll)
565: (comp-err " go not within prog"))
566: (cond ((caar ll)
567: (setq levels count)
568: (comp-warn " non-local go used")
569: (return (cadar ll))))))))
570:
571: (cond ((not (setq v-r (get use-labs v-l)))
572: (put use-labs v-l (setq v-r (Gensym nil)))))
573: (setq v-t (f-addi (list 'go v-r) v-t))
574: (cond (levels (setq v-t (f-addi `(unbind ,levels) v-t))))
575: (return v-t))))
576:
577: (putprop 'lambda 'f-lambda 'x-spf)
578:
579: ;--- f-lambda - ?? how is this routine called, certainly this isnt the
580: ; same as ((lambda (n) form) arg)
581: ;
582:
583: (putprop 'and 'f-and 'x-spf)
584:
585: (def f-and
586: (lambda (v-l v-r v-t)
587: (f-aor v-l 'and v-r v-t)))
588:
589: (putprop 'or 'f-or 'x-spf)
590:
591: (def f-or
592: (lambda (v-l v-r v-t)
593: (f-aor v-l 'or v-r v-t)))
594:
595:
596:
597: (putprop 'prog2 'prog2toprog 'x-spfm)
598:
599:
600: ;--- prog2toprog - v-e : prog2 expression
601: ; we convert this (prog2 a b c d e f) to
602: ; (progn a ((lambda (newsim) c d e f newsim) b))
603: ; simple enough.
604: ;
605: (def prog2toprog
606: (lambda (v-e)
607: ((lambda (newsim)
608: `(progn ,(cadr v-e)
609: ((lambda (,newsim)
610: ,@(cdddr v-e)
611: ,newsim)
612: ,(caddr v-e))))
613: (Gensym nil))))
614:
615:
616: (putprop 'progn 'f-seq 'x-spf)
617:
618: (putprop 'return 'f-return 'x-spfn)
619:
620: ;--- f-return - v-l : arg to return, may be nil meaning return nil
621: ; - v-r : psreg in which to store result
622: ; - v-t : tail
623: ; this handles the return statement. While returns should
624: ; occur in progs, this allows for a return inside a context
625: ; which is inside a prog (or do). If this is a simple return
626: ; from prog or do, we have:
627: ; ... code to place to be returned val in v-r
628: ; (go retlb) jump to label at end of prog body
629: ; but before special unbinding
630: ; for non local cases we have
631: ; ... code to place value to be returned into v-r
632: ; (unwind levels) where is levels is the number of enclosing
633: ; contexts (which begin with a (begin xx)) to return
634: ; from.
635: ; (go retlb) then go to the return spot.
636: ;
637: (def f-return
638: (lambda (v-l v-r v-t)
639: (prog (use-ret levels)
640: (setq use-ret
641: (cond (w-ret)
642: (t (do ((ll w-save (cdr ll))
643: (count 0 (add1 count)))
644: ((null ll)
645: (comp-err " return not within a prog"))
646: (cond ((caar ll)
647: (setq levels count)
648: (comp-warn " non local return used")
649: (return (caar ll))))))))
650:
651: (setq v-t (f-addi (cdr use-ret) v-t))
652: (cond (levels (setq v-t (f-addi `(unbind ,levels) v-t))))
653: (return (f-exp (and v-l (car v-l)) (f-use (car use-ret)) v-t)))))
654:
655: (putprop 'null 'f-null 'x-spfn)
656:
657: (def f-null
658: (lambda (v-l v-r v-t)
659: (cond ((f-test v-t)
660: (rplaca (cdar (rplacd v-t (f-xval (f-swap (cdr v-t)) v-r)))
661: (f-use (setq v-r (Gensym nil))))
662: (f-exp (car v-l) v-r v-t)))))
663:
664: (putprop 'not 'f-null 'x-spfn)
665:
666:
667: (def f-type
668: (lambda (v-l v-r v-t v-bits)
669: (cond ((f-test v-t)
670: (setq v-t (f-xval (cdr v-t) v-r))
671: (f-exp (car v-l)
672: (setq v-r (Gensym nil))
673: (f-addi (list 'getype (f-use v-r) v-bits) v-t))))))
674:
675: (putprop 'atom 'f-atom 'x-spfn)
676:
677: (def f-atom
678: (lambda (v-l v-r v-t)
679: (f-type v-l v-r v-t '(0 1 2 4 5 6 7 9 10))))
680:
681: (putprop 'numberp 'f-numberp 'x-spfn)
682:
683: (def f-numberp
684: (lambda (v-l v-r v-t)
685: (f-type v-l v-r v-t '(2 4 9))))
686:
687: (putprop 'symbolp 'f-symbolp 'x-spfn)
688:
689: (def f-symbolp
690: (lambda (v-l v-r v-t)
691: (f-type v-l v-r v-t 1)))
692:
693: (putprop 'dtpr 'f-dtpr 'x-spfn)
694:
695: (def f-dtpr
696: (lambda (v-l v-r v-t)
697: (f-type v-l v-r v-t 3)))
698:
699: (putprop 'bcdp 'f-bcdp 'x-spfn)
700:
701: (def f-bcdp
702: (lambda (v-l v-r v-t)
703: (f-type v-l v-r v-t 5)))
704:
705: (putprop 'stringp 'f-stringp 'x-spfn)
706:
707: (def f-stringp
708: (lambda (v-l v-r v-t)
709: (f-type v-l v-r v-t 0)))
710:
711: (putprop 'type 'f-ty 'x-spfn)
712:
713: (def f-ty
714: (lambda (v-l v-r v-t)
715: (f-exp (car v-l)
716: (setq v-r (Gensym nil))
717: (f-addi (list 'getype (f-use v-r) 'name) v-t))))
718:
719: (putprop 'eq 'f-eq 'x-spfn)
720:
721: (def f-eq
722: (lambda (v-l v-r v-t)
723: (prog (v-r1)
724: (cond ((f-test v-t)
725: (setq v-t (f-xval (cdr v-t) v-r))
726: (cond ((and (f-one (car v-l)) (f-one (cadr v-l)))
727: (return (f-addi (list 'eqv (car v-l) (cadr v-l))
728: v-t))))
729: (return (f-pusha v-l
730: (Gensym nil)
731: (f-addi '(eqs) v-t))))))))
732:
733: (putprop 'cons 'f-repl 'x-spfh)
734:
735: '(putprop 'map 'f-domap 'x-spfh)
736:
737: '(putprop 'mapc 'f-domap 'x-spfh)
738:
739: '(putprop 'mapcar 'f-domap 'x-spfh)
740:
741: '(putprop 'maplist 'f-domap 'x-spfh)
742:
743: (putprop 'zerop 'f-zerop 'x-spfm)
744:
745: (def f-zerop
746: (lambda (v-e)
747: (list 'equal 0 (cadr v-e))))
748:
749: (putprop 'plist 'f-plist 'x-spfm)
750:
751: (def f-plist
752: (lambda (v-e)
753: (list 'car (cadr v-e))))
754:
755: (putprop 'go 'f-xgo 'x-opt)
756:
757: (def f-xgo
758: (lambda (v-i v-t)
759: (setq v-t (f-chop v-t))
760: (cond ((equal (cadr v-i) (cadar v-t)) v-t)
761: (t (cons v-i v-t)))))
762:
763: (putprop 'return 'f-xreturn 'x-opt)
764:
765: (def f-xreturn
766: (lambda (v-i v-t)
767: (cons v-i (f-chop v-t))))
768:
769: (putprop 'repeat 'f-xreturn 'x-opt)
770:
771: (putprop 'false 'f-tfo 'x-opt)
772:
773: (putprop 'true 'f-tfo 'x-opt)
774:
775:
776: (putprop '*catch 'f-*catch 'x-spf)
777:
778:
779: ;--- f-*catch - v-l : list of (tag exp) , tag is evaled, exp is to be run
780: ; - v-r : result register
781: ; - v-t : tail
782: ; This compiles a catch by emiting these intermediate codes:
783: ; ..calculate tag..
784: ; (catchent <gensym> <tag> nil)
785: ; .. code to eval (car v-l) ..
786: ; (catchexit)
787: ; (label <gensym>)
788: ;
789: ; The catchent sets up a catch frame on the c-runtime stack.
790: ; The (car v-l) is evaluated and the result placed in r0 (it must
791: ; be since that is where the value would be thrown). If no throw
792: ; is done, it enters the catchexit which pops our catchframe off
793: ; the stack. If a throw is done it ends up at the label <gensym>
794: ; with the catch frame already popped off.
795: ;
796: (def f-*catch
797: (lambda (v-l v-r v-t)
798: (prog (v-loop v-tag x y z v-nr)
799: (setq v-tag (car v-l))
800: ; we check to make sure we can force v-r to be r0, else
801: ; we must give up.
802: (cond ((and (get v-r 'x-reg)
803: (not (equal (get v-r 'x-reg) 0)))
804: (err '"Can't compile catch correctly"))
805: (t (f-make v-r 0)))
806:
807: (return
808: (f-exp v-tag
809: (setq v-nr (Gensym nil))
810: (f-addi `(catchent ,(setq v-loop (Gensym nil))
811: ,(f-use v-nr)
812: nil)
813: (f-exp (cadr v-l) (f-use v-r)
814: (f-addi `(catchexit)
815: (f-addi `(label ,v-loop) v-t)))))))))
816:
817: (putprop 'errset 'f-errset 'x-spf)
818: ;--- f-errset - v-l : list of (errset form [flag])
819: ; - v-r : place to put result.
820: ; - v-t : tail
821: ;
822: ; This sets up an errset frame. It is different than a catch in
823: ; that the tag is always (ER%all) and the result returned upon
824: ; a regular exit is listified.
825: ; again, we must insure that v-r can be forced to be r0 since
826: ; an err or error will place the result there.
827: ;
828: (def f-errset
829: (lambda (v-l v-r v-t)
830: (prog (v-loop v-tag v-flag v-nr)
831: (cond ((and (get v-r 'x-reg) (not (equal (get v-r 'x-reg) 0)))
832: (err '"Can't compile errset correctly"))
833: (t (f-make v-r 0)))
834:
835: ; flag tells if error message will be reported, t if so.
836: ; t is the default
837: (cond ((cdr v-l) (setq v-flag (cadr v-l)))
838: (t (setq v-flag t)))
839:
840: (return
841: (f-exp v-flag
842: (setq v-nr (Gensym nil))
843: (f-addi `(catchent ,(setq v-loop (Gensym nil))
844: '(ER%all)
845: ,(f-use v-nr))
846: (f-exp (car v-l)
847: v-r
848: `((catchexit)
849: (push ,v-r)
850: (call ,v-r _Lncons 1)
851: (label ,v-loop)
852: ,@v-t))))))))
853:
854:
855:
856:
857: (putprop '*throw 'f-*throw 'x-spf)
858:
859: ;--- f-*throw - v-l : list of (tag exp)
860: ; - v-r : loc to eval exp to
861: ; - v-t : tail
862: ;
863: (def f-*throw
864: (lambda (v-l v-r v-t)
865: (let ((v-nr (Gensym nil)))
866: (f-exp (car v-l)
867: v-nr
868: (f-exp (cadr v-l) v-r
869: (f-addi `(*throw ,(f-use v-r) ,(f-use v-nr)) v-t))))))
870:
871:
872: (putprop 'arg 'f-arg 'x-spf)
873:
874: ;--- f-arg - v-l : list of arg to evaluate
875: ; - v-r : place to store value
876: ; - v-t : tail
877: (def f-arg
878: (lambda (v-l v-r v-t)
879: (f-exp (car v-l) v-r
880: (f-addi `(arg ,(f-use v-r))
881: v-t))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.