|
|
1.1 root 1:
2: ;----------- macros for the compiler -------------
3:
4:
5: (setq sectioncamacsid "@(#)camacs.l 5.2 11/11/80") ; id for SCCS
6:
7: ; Copyright (c) 1980 , The Regents of the University of California.
8: ; All rights reserved.
9: ; author: j. foderaro
10:
11: (declare (macros t)) ; compile and save macros
12:
13: ;--- comp-err
14: ; comp-warn
15: ; comp-note
16: ; comp-gerr
17: ; these are the compiler message producing macros. The form is
18: ; (comp-xxxx val1 val2 val3 ... valn) , all values are printed according
19: ; to this scheme. If vali is an atom, it is patomed, if vali is a
20: ; list, it is evaluated and printed. If vali is N a newline is printed
21: ;
22: ; furthermore
23: ; the name of the current function is printed first
24: ; after comp-err prints the message, it does a throw to Comp-err .
25: ; errors are preceeded by Error:
26: ; warnings by %Warning: and
27: ; notes by %Note:
28: ; The message is sent to the message file
29: ;
30: (def comp-err
31: (macro (l)
32: `(progn ,@(comp-msg
33: `( "Error: " g-fname ": " ,@(cdr l) N))
34: (setq er-fatal (1+ er-fatal))
35: (throw nil Comp-error))))
36:
37: (def comp-warn
38: (macro (l)
39: `(progn (cond (fl-warn
40: ,@(comp-msg
41: `( "%Warning: " g-fname ": " ,@(cdr l) N)))))))
42:
43: (def comp-note
44: (macro (l)
45: `(progn (cond (fl-verb
46: ,@(comp-msg
47: `( "%Note: " ,@(cdr l) N)))))))
48:
49: (def comp-gerr
50: (macro (l)
51: `(progn ,@(comp-msg
52: `("?Error: " ,@(cdr l) N))
53: (setq er-fatal (1+ er-fatal)))))
54:
55: ;--- comp-msg - port
56: ; - lst
57: ; prints the lst to the given port. The lst is printed in the manner
58: ; described above, that is atoms are patomed, and lists are evaluated
59: ; and printed, and N prints a newline. The output is always drained.
60: ;
61: (eval-when (compile load eval)
62: (def comp-msg
63: (lambda (lis)
64: (cond ((null lis) `((drain)))
65: (t `(,(cond ((atom (car lis))
66: (cond ((eq (car lis) 'N)
67: `(terpr))
68: (t `(niceprint ,(car lis)))))
69: (t `(niceprint ,(car lis))))
70: ,@(comp-msg (cdr lis)))))))
71: (def niceprint
72: (macro (l)
73: `((lambda (val)
74: (cond ((floatp val)
75: (patom (quotient (fix (times val 100)) 100.0)))
76: (t (patom val))))
77: ,(cadr l)))))
78:
79: ;--- super if macro
80: (defun If macro (lis)
81: (prog (majlis minlis revl)
82: (do ((revl (reverse lis) (cdr revl)))
83: ((null revl))
84: (cond ((eq (car revl) 'else)
85: (setq majlis `((t ,@minlis) ,@majlis)
86: minlis nil))
87: ((or (eq (car revl) 'then) (eq (car revl) 'thenret))
88: (setq revl (cdr revl)
89: majlis `((,(car revl) ,@minlis) ,@majlis)
90: minlis nil))
91: ((eq (car revl) 'elseif))
92: ((eq (car revl) 'If)
93: (setq majlis `(cond ,@majlis)))
94: (t (setq minlis `( ,(car revl) ,@minlis)))))
95: ; we displace the previous macro, that is we actually replace
96: ; the if list structure with the corresponding cond, meaning
97: ; that the expansion is done only once
98: (rplaca lis (car majlis))
99: (rplacd lis (cdr majlis))
100: (return majlis)))
101:
102: ;--- standard push macro
103: ; (Push stackname valuetoadd)
104:
105: (defmacro Push (atm val)
106: `(setq ,atm (cons ,val ,atm)))
107:
108: ;--- pop macro
109:
110: (defmacro Pop (val)
111: `(prog1 (car ,val) (setq ,val (cdr ,val))))
112:
113: ;--- unpush macro - like pop except top value is thrown away
114: (defmacro unpush (atm)
115: `(setq ,atm (cdr ,atm)))
116:
117: ;--- and an increment macro
118:
119: (defmacro incr (atm)
120: `(setq ,atm (1+ ,atm)))
121:
122: (defmacro decr (atm)
123: `(setq ,atm (1- ,atm)))
124: ;--- add a comment
125:
126: (defmacro makecomment (arg)
127: `(cond (fl-comments (setq g-comments (cons ,arg g-comments)))))
128:
129: ;--- add a comment irregardless of the fl-comments flag
130: (defmacro forcecomment (arg)
131: `(setq g-comments (cons ,arg g-comments)))
132:
133: ;--- write to the .s file
134:
135: (defmacro sfilewrite (arg)
136: `(patom ,arg vp-sfile))
137:
138:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.