|
|
1.1 root 1: ;; file of common cmu functions which should be macros
2: ;; I hope that by just loading in the file an environment will be
3: ;; created which will permit the cmu files to be compiled.
4:
5: (setq rcs-cmumacs-
6: "$Header: /usr/lib/lisp/cmumacs.l,v 1.1 83/01/29 18:34:31 jkf Exp $")
7:
8: (declare (macros t))
9:
10: (eval-when (compile eval load)
11: (or (boundp 'CMU-fcn-def) (setq CMU-fcn-def (getd 'def))))
12:
13: ;-- contents
14: ; dv mark!changed *** list* [construct-list* lambda]
15: ; neq push pop mukname (equivlance)
16: ; prin1 (equiv to print) selectq lineread
17: ;
18:
19: ;--- dv :: set variable to value and remember it was changed
20: ; (dv name value) name is setq'ed to value (no evaluation) and
21: ; the fact that it was done is remembered
22: ;
23: (defmacro dv (name value)
24: `(progn 'compile
25: (setq ,name ',value)
26: (mark!changed ',name)))
27:
28: (defmacro mark!changed (name)
29: `(let ((atomname ,name))
30: (and (boundp '%changes) (setq %changes (cons atomname %changes)))
31: atomname))
32:
33: ;--- *** :: comment macro
34: ;
35: (defmacro *** (&rest x) nil)
36:
37: ;; this must be rewritten as a macro ****
38: ;(def quote! (nlambda (a) (quote!-expr a)))
39:
40: ; this will be thrown away if the code below it works
41: (def quote!-expr
42: (lambda
43: (x)
44: (cond ((atom x) x)
45: ((eq (car x) '!)
46: (cons (eval (cadr x)) (quote!-expr (cddr x))))
47: ((eq (car x) '!!)
48: (cond ((cddr x)
49: (append (eval (cadr x)) (quote!-expr (cddr x))))
50: (t (eval (cadr x)))))
51: (t
52: (prog (u v)
53: (setq u (quote!-expr (car x)))
54: (setq v (quote!-expr (cdr x)))
55: (cond ((and (eq u (car x)) (eq v (cdr x))) (return x)))
56: (return (cons u v)))))))
57: ;; this is probably what the above forms do. (jkf)
58: (defmacro quote! (&rest a) (quote!-expr-mac a))
59: (eval-when (compile eval load)
60:
61: (defun quote!-expr-mac (form)
62: (cond ((null form) nil)
63: ((atom form) `',form)
64: ((eq (car form) '!)
65: `(cons ,(cadr form) ,(quote!-expr-mac (cddr form))))
66: ((eq (car form) '!!)
67: (cond ((cddr form) `(append ,(cadr form)
68: ,(quote!-expr-mac (cddr form))))
69: (t (cadr form))))
70: (t `(cons ,(quote!-expr-mac (car form))
71: ,(quote!-expr-mac (cdr form))))))
72:
73: ); end eval-when
74:
75:
76: ;--- the following are macroizations from cmu3.l
77:
78: ;(jkf)- ucb list* macro.
79: ;
80: (defmacro list* (&rest forms)
81: (cond ((null forms) nil)
82: ((null (cdr forms)) (car forms))
83: (t (construct-list* forms))))
84:
85: (defun construct-list* (forms)
86: (setq forms (reverse forms))
87: (do ((forms (cddr forms) (cdr forms))
88: (return-form `(cons ,(cadr forms) ,(car forms))
89: `(cons ,(car forms) ,return-form)))
90: ((null forms) return-form)))
91:
92: (defmacro neq (a b) `(not (eq ,a ,b)))
93:
94:
95: (defmacro push (value stack) `(setq ,stack (cons ,value ,stack)))
96:
97:
98:
99:
100:
101: ;(jkf) this is actually maknum is the maclisp terminology
102: (putd 'munknam (getd 'maknum))
103:
104: ; added for CMULisp compatibilty (used by editor etc)
105: (putd 'prin1 (getd 'print))
106:
107: ;--- selectq :: case statement type construct
108: ;
109: ; (selectq <form>
110: ; (<tag1> <expr1> ...)
111: ; (<tag2> <expr2> ...)
112: ; ...
113: ; (<tagn> <exprn> ...)
114: ; (<exprfinal> ...))
115: ; <form> is evaluated and then compared with the tagi, if it matches
116: ; the expri are evaluated. If it doesn't match, then <exprfinal> are
117: ; evaluated.
118: ;
119: (def selectq
120: (macro (form)
121: ((lambda (x)
122: `((lambda (,x)
123: (cond
124: ,@(maplist
125: '(lambda (ff)
126: (cond ((null (cdr ff))
127: `(t ,(car ff)))
128: ((atom (caar ff))
129: `((eq ,x ',(caar ff))
130: . ,(cdar ff)))
131: (t
132: `((memq ,x ',(caar ff))
133: . ,(cdar ff)))))
134: (cddr form))))
135: ,(cadr form)))
136: (gensym 'Z))))
137:
138: (defmacro lineread (&optional (x nil))
139: `(%lineread ,x))
140:
141:
142:
143: (defmacro de (name &rest body)
144: (cond ((status feature complr) `(def ,name (lambda ,@body)))
145: (t `(progn (putd ,name '(lambda ,@body))
146: (mark!changed ',name)))))
147: (defmacro dn (name &rest body)
148: (cond ((status feature complr) `(def ,name (nlambda ,@body)))
149: (t `(progn (putd ,name '(nlambda ,@body))
150: (mark!changed ',name)))))
151: (defmacro dm (name &rest body)
152: (cond ((status feature complr) `(def ,name (macro ,@body)))
153: (t `(progn (putd ,name '(macro ,@body))
154: (mark!changed ',name)))))
155:
156: (eval-when (compile eval load)
157: (or (boundp 'OLD-fcn-def) (setq OLD-fcn-def (getd 'def))))
158:
159: (defmacro def (&rest form)
160: (cond ((status feature complr)
161: `(progn 'compile
162: (eval-when (compile) (putd 'def OLD-fcn-def))
163: (def ,@form)
164: (eval-when (compile) (putd 'def CMU-fcn-def))))
165: (t `(progn (putd ',(car form) ',(cadr form))
166: (mark!changed ',(car form))))))
167:
168: (eval-when (compile eval load)
169: (or (boundp 'CMU-fcn-def) (setq CMU-fcn-def (getd 'def))))
170:
171: ;--iteration macros
172:
173: (def Cdo (macro (l) (expand-do l)))
174:
175: (def exists (macro (l) (expand-ex 'some l)))
176:
177: (declare (special var))
178:
179: (eval-when (compile eval load)
180:
181: (def expand-ex
182: (lambda
183: (fn form)
184: (quote! !
185: fn
186: !
187: (caddr form)
188: (function
189: (lambda
190: !
191: (cond ((atom (cadr form)) (ncons (cadr form)))
192: (t (cadr form)))
193: !
194: (car (setq form (cdddr form)))))
195: !
196: (cond ((cdr form) (list 'function (cadr form)))))))
197: ) ; end eval-when
198:
199: (def expand-do
200: (lambda
201: (l)
202: (prog (label var init incr limit part)
203: (cond
204: ((setq part (memq 'for l))
205: (setq var (cadr part))
206: (setq l (append (ldiff l part) (cddr part)))))
207: (cond
208: ((setq part (exists w l (memq w '(gets = _ :=))))
209: (setq init (cadr part))
210: (setq l (append (ldiff l part) (cddr part)))))
211: (cond
212: ((setq part (exists w l (memq w '(step by))))
213: (setq incr (cadr part))
214: (setq l (append (ldiff l part) (cddr part)))))
215: (cond
216: ((setq part (memq 'to l))
217: (setq limit (cadr part))
218: (setq l (append (ldiff l part) (cddr part)))))
219: (return
220: (quote! prog
221: !
222: (cond (var (ncons var)))
223: !!
224: (cond
225: (var
226: (ncons
227: (list 'setq var (cond (init) (t 1))))))
228: !
229: (setq label (gensym))
230: !!
231: (mapcan (function
232: (lambda
233: (exp)
234: (cond ((eq part 'while)
235: (setq part nil)
236: (quote!
237: (cond
238: ((not ! exp) (return nil)))))
239: ((eq part 'until)
240: (setq part nil)
241: (quote!
242: (cond (! exp (return nil)))))
243: ((memq (setq part exp)
244: '(while until do Cdo))
245: nil)
246: (t (ncons exp)))))
247: l)
248: !!
249: (cond
250: (var
251: (quote!
252: (setq ! var (+ ! var ! (cond (incr) (t 1)))))))
253: !!
254: (cond
255: ((and var limit)
256: (quote! (cond ((> ! var ! limit) (return nil))))))
257: (go ! label))))))
258:
259:
260: (def expand-fe
261: (lambda
262: (form)
263: (prog (vars body)
264: (return
265: (cons (cond ((memq (cadr form)
266: (quote
267: (map mapc
268: mapcan
269: mapcar
270: mapcon
271: mapconc
272: maplist)))
273: (setq form (cdr form))
274: (car form))
275: (t 'mapc))
276: (progn (setq vars (cadr form))
277: (cond ((atom vars) (setq vars (list vars))))
278: (cons (cons 'function
279: (ncons
280: (cons 'lambda
281: (cons vars
282: (setq body
283: (Cnth (cdddr
284: form)
285: (length
286: vars)))))))
287: (ldiff (cddr form) body))))))))
288: (def expand-set-of
289: (lambda
290: (form)
291: (prog (vars body)
292: (setq vars (cadr form))
293: (cond ((atom vars) (setq vars (list vars))))
294: (setq form (cddr form))
295: (return
296: (quote! mapcan
297: (function
298: (lambda
299: !
300: vars
301: (cond
302: (! (car
303: (setq body (Cnth (cdr form) (length vars))))
304: (list ! (car vars))))))
305: !!
306: (ldiff form body))))))
307:
308: (dv filelst nil)
309:
310: (def for (macro (l) (expand-do l)))
311:
312: (def for-each (macro (l) (expand-fe l)))
313:
314: (def forall (macro (l) (expand-ex 'every l)))
315:
316: (def set-of (macro (l) (expand-set-of l)))
317:
318: (def ty (macro (f) (append '(exec cat) (cdr f))))
319:
320: (def until (macro (l) (expand-do l)))
321:
322: (def while (macro (l) (expand-do l)))
323:
324: (putprop 'cmumacs t 'version)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.