|
|
1.1 root 1:
2:
3:
4: ;--- msg - arg1 ... arguments of the form described below
5: ; B - print out a blank
6: ; N - print out a newline (terpr)
7: ; (B n) - print out n blanks
8: ; (P p) - henceforth print on port p
9: ; atom - patom this exactly (no evaluation)
10: ; other - evaluate and patom this expression.
11: ;
12: (def msg
13: (macro (lis)
14: `(progn ,@(msgmake (cdr lis) 'nil))))
15:
16: (eval-when (eval compile load)
17: (def msgmake
18: (lambda (forms outport)
19: ((lambda (thisform)
20:
21: (cond ((null forms) `((drain ,@outport)))
22: ((and (eq 'B thisform) (setq thisform '" ") nil))
23: ((eq 'N thisform) (cons `(terpr ,@outport)
24: (msgmake (cdr forms) outport)))
25: ((atom thisform) (cons `(patom ',thisform
26: ,@outport)
27: (msgmake (cdr forms) outport)))
28: ((eq 'P (car thisform)) (msgmake (cdr forms)
29: `(,@(cdr thisform))))
30:
31: ((eq 'B (car thisform)) (cons `(printblanks ,@(cdr thisform)
32: ,outport)
33: (msgmake (cdr forms) outport)))
34: (t (cons `(patom ,thisform ,@outport)
35: (msgmake (cdr forms) outport)))))
36: (car forms)))))
37:
38: (def printblanks
39: (lambda (n prt)
40: (do ((i n (sub1 i)))
41: ((lessp i 1))
42: (patom '" " prt))))
43:
44:
45:
46:
47: ; ==============================================
48: ;
49: ; (linelength [numb])
50: ;
51: ; sets the linelength (actually just varib linel) to the
52: ; number given: numb
53: ; if numb is not given, the current line length is returned
54: ; =================================================
55:
56: (setq linel 80)
57: (def linelength
58: (nlambda (form)
59: (cond ((null form) linel )
60: ((numberp (car form)) (setq linel (car form)))
61: (t linel))))
62:
63: ; ========================================
64: ;
65: ; (charcnt port)
66: ; returns the number of characters left on the current line
67: ; on the given port
68: ;
69: ; =======================================
70:
71:
72: (def charcnt
73: (lambda (port) (diff linel (nwritn port))))
74:
75: (def nthcdr
76: (lambda (n x)
77: (cond ((equal n 0) x)
78: ((lessp n 0) (cons nil x))
79: (t (nthcdr (sub1 n) (cdr x) )))))
80:
81: ;r lambda: (nthrest numb list)
82: ;- args: numb - integer
83: ;- list - list
84: ;- returns:the rest of the list beginning at the numb'th element.
85: ;- for convience, (nthrest 0 list) equals (nthrest 1 list)
86: ;- equals list. This is designed to be similar to nthelem
87: ;- which returns the nth element of a list.
88:
89: (def nthrest
90: (lambda (number list)
91: (cond ((lessp number 2) list)
92: (t (nthrest (sub1 number) (cdr list))))))
93:
94:
95: ;;==============================
96: ; (assqr val alist)
97: ; acts much like assq, it looks for val in the cdr of elements of
98: ; the alist and returns the element if found.
99: ; fix this when the compiler works
100: (eval-when nil (def assqr
101: (lambda (val alist)
102: (do ((al alist (cdr al)))
103: ((null al) nil)
104: (cond ((eq val (cdar al)) (return (car al))))))))
105:
106:
107: ; ====================
108: ; (listp 'x) is t if x is a non-atom or nil
109: ; ====================
110: (def listp (lambda (val) (or (dtpr val) (null val))))
111:
112:
113:
114: ;--- memcar - VAL : lispval
115: ; - LIS : list
116: ; returns t if VAL found as the car of a top level element.
117: ;temporarily turn this off till the compiler can handle it.
118: (eval-when nil (def memcar
119: (lambda (a l)
120: (do ((ll l (cdr ll)))
121: ((null ll) nil)
122: (cond ((equal (caar ll) a) (return (cdar ll))))))))
123:
124: ; =================================
125: ;
126: ; (memcdr 'val 'listl)
127: ;
128: ; the list listl is searched for a list
129: ; with cdr equal to val. if found, the
130: ; car of that list is returned.
131: ; ==================================
132: ;fix this when compiler works ok
133: (eval-when nil (def memcdr
134: (lambda (a l)
135: (do ((ll l (cdr ll)))
136: ((null ll) nil)
137: (cond ((equal (cdar ll) a) (return (caar l))))))))
138:
139:
140: (def apply*
141: (nlambda ($x$)
142: (eval (cons (eval (car $x$)) (cdr $x$)))))
143:
144:
145:
146:
147:
148: ; =======================================
149: ; pretty printer top level routine pp
150: ;
151: ; calling form- (pp arg1 arg2 ... argn)
152: ; the args may be names of functions, atoms with associated values
153: ; or output descriptors.
154: ; if argi is:
155: ; an atom - it is assumed to be a function name, if there is no
156: ; function property associated with it,then it is assumed
157: ; to be an atom with a value
158: ; (P port)- port is the output port where the results of the
159: ; pretty printing will be sent.
160: ; poport is the default if no (P port) is given.
161: ; (F fname)- fname is a file name to write the results in
162: ; (A atmname) - means, treat this as an atom with a value, dont
163: ; check if it is the name of a function.
164: ;
165: (declare (special $outport$ $fileopen$ ))
166:
167: ; printret is like print yet it returns the value printed, this is used
168: ; by pp
169: (def printret
170: (macro ($l$)
171: `(progn (print ,@(cdr $l$)) ,(cadr $l$))))
172:
173: (def pp
174: (nlambda ($xlist$)
175: (prog ($outport$ $cur$ $fileopen$ $prl$ $atm$)
176:
177: (setq $outport$ poport) ; default port
178: ; check if more to do, if not close output file if it is
179: ; open and leave
180:
181:
182: toploop (cond ((null (setq $cur$ (car $xlist$)))
183: (condclosefile)
184: (return t)))
185:
186: (cond ((dtpr $cur$)
187: (cond ((equal 'P (car $cur$)) ; specifying a port
188: (condclosefile) ; close file if open
189: (setq $outport$ (eval (cadr $cur$))))
190:
191: ((equal 'F (car $cur$)) ; specifying a file
192: (condclosefile) ; close file if open
193: (setq $outport$ (outfile (cadr $cur$))
194: $fileopen$ t))
195:
196: ((equal 'A (car $cur$)) ; declaring atomness
197: (setq $atm$ t)
198: (setq $cur$ (cadr $cur$))
199: (go midstuff))
200:
201: ((eq 'V (car $cur$)) ; print value only
202: (setq $atm$ 'value)
203: (setq $cur$ (cadr $cur$))
204: (go midstuff))
205:
206: (t (msg N "bad arg to pp: " (or $cur$))))
207: (go botloop)))
208: midstuff ; process the atom or function
209:
210: (cond ((eq 'value $atm$)
211: (setq $prl$ (eval $cur$)))
212:
213: ((or $atm$ (null (getd $cur$))) ; check if is atom
214: (cond ((boundp $cur$) ; yes, see if bound
215: (setq $prl$ (list 'setq $cur$ (list 'quote
216: (eval $cur$)))))
217: (t (msg N "pp: atom " (or $cur$) " is unbound")
218: (go botloop))))
219:
220: ((bcdp (getd $cur$)) ; is a fcn, see if bcd
221: (msg N "pp: function " (or $cur$) " is machine coded (bcd) ")
222: (go botloop))
223:
224: (t (setq $prl$ (list 'def $cur$ (getd $cur$)))))
225:
226: ; now print it
227:
228: ($prpr $prl$)
229: (terpr $outport$)
230: (setq $atm$ nil) ; clear flag
231:
232: botloop (setq $xlist$ (cdr $xlist$))
233:
234: (go toploop))))
235:
236:
237:
238: (def condclosefile
239: (lambda nil
240: (cond ($fileopen$
241: (terpr $outport$)
242: (close $outport$)
243: (setq $fileopen$ nil)))))
244:
245: ;
246: ; these routines are meant to be used by pp but since
247: ; some people insist on using them we will set $outport$ to nil
248: ; as the default
249: (setq $outport$ nil)
250:
251:
252: (def $prpr
253: (lambda (x)
254: (cond ((not (boundp '$outport$)) (setq $outport$ poport)))
255: (terpr $outport$)
256: ($prdf x 0 0)))
257:
258:
259: (declare (special m))
260:
261: (def $prdf
262: (lambda (l n m)
263: (prog ()
264: ($tocolumn n)
265: a (cond ((or (atom l)
266: (lessp (add m (flatsize l (chrct $outport$)))
267: (chrct $outport$)))
268: (return (printret l $outport$)))
269: ((and ($patom1 lpar)
270: (lessp 2 (length l))
271: (atom (car l)))
272: (prog (c f g h)
273: (setq g
274: (cond ((member (car l) '(lambda nlambda))
275: -7)
276: (t
277: 0)))
278: (setq f (equal (printret (car l) $outport$) 'prog))
279: ($patom1 ' " ")
280: (setq c ($dinc))
281: a ($prd1
282: (cdr l)
283: (add
284: c
285: (cond ((setq h (and f
286: (cadr l)
287: (atom (cadr l))))
288: -5)
289: (t g))))
290: (cond ((cdr (setq l (cdr l)))
291: (cond ((or (null h) (atom (cadr l)))
292: (terpr $outport$)))
293: (go a)))))
294: ((prog (c)
295: (setq c ($dinc))
296: a ($prd1 l c)
297: (cond ((setq l (cdr l))
298: (terpr $outport$)
299: (go a))))))
300: b ($patom1 rpar))))
301:
302:
303:
304: (def $prd1
305: (lambda (l n)
306: (prog ()
307: ($prdf (car l)
308: n
309: (cond ((null (setq l (cdr l))) (add m 1))
310: ((atom l) (setq n nil) (plus 4 m (pntlen l)))
311: (t m)))
312: (cond ((null n)
313: ($patom1 ' " . ")
314: (return (printret l $outport$)))))))
315:
316:
317:
318:
319:
320: (def $dinc (lambda () (diff (linelength $outport$) (chrct $outport$))))
321:
322:
323: (def $tocolumn
324: (lambda (n)
325: (cond ((greaterp (setq n (diff n (nwritn $outport$))) 0)
326: (do ((i 0 (add1 i)))
327: ((equal i n))
328: (patom '" " $outport$))))))
329:
330: ; ========================================
331: ;
332: ; (charcnt port)
333: ; returns the number of characters left on the current line
334: ; on the given port
335: ;
336: ; =======================================
337:
338:
339: (def charcnt
340: (lambda (port) (diff linel (nwritn port))))
341:
342: (putd 'chrct (getd 'charcnt))
343:
344: (def $patom1 (lambda (x) (patom x $outport$)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.