BSD 4_3 development
[unix-history] / usr / lib / lisp / cmufncs.l
CommitLineData
5ffa1c4c
C
1(setq rcs-cmufncs-
2 "$Header: /usr/lib/lisp/cmufncs.l,v 1.1 83/01/29 18:34:20 jkf Exp $")
3
4(eval-when (compile eval) (load 'cmumacs))
5
6(declare (special filelst %changes $%dotflg %prevfn% %%cfn part %%l
7 lastword %trcflg form fn))
8(def tab (lexpr (n)
9 (prog (nn prt) (setq nn (arg 1))
10 (cond ((> n 1)(setq prt (arg 2))))
11 (cond ((> (nwritn prt) nn) (terpri prt)))
12 (printblanks (- nn (nwritn prt)) prt))))
13
14
15(dv $%dotflg nil)
16(def %lineread
17 (lambda
18 (chan)
19 (prog (ans)
20 loop (setq ans (cons (read chan 'EOF) ans))
21 (cond ((eq (car ans) 'EOF) (return (reverse (cdr ans)))))
22 loop2(cond ((eq 10 (tyipeek chan)) (return (reverse ans)))
23 ((memq (tyipeek chan) '(41 93))
24 (tyi chan)
25 (go loop2))
26 (t (go loop))))))
27
28
29(dv %prevfn% " ")
30(dv %trcflg t)
31
32(def attach
33 (lambda
34 (x y)
35 (cond ((dtpr y) (rplacd y (cons (car y) (cdr y))) (rplaca y x))
36 (t (eprint y) (error '"IS AN ATOM, CAN'T BE ATTACHED TO")))))
37
38(dv %changes ())
39
40(def dremove
41 (lambda (x l)
42 (cond ((atom l) nil)
43 ((eq x (car l))
44 (cond ((cdr l)
45 (rplaca l (cadr l))
46 (rplacd l (cddr l))
47 (dremove x l))))
48 (t (prog (z)
49 (setq z l)
50 lp (cond ((atom (cdr l)) (return z))
51 ((eq x (cadr l)) (rplacd l (cddr l)))
52 (t (setq l (cdr l))))
53 (go lp))))))
54(def dreverse
55 (lambda (l)
56 (prog (l1 y z)
57 (setq l1 l)
58 l1 (cond
59 ((atom (setq y l))
60 (cond ((or (null z) (null (cdr z))) (return z))
61 ((null (cddr z))
62 (setq y (car l1))
63 (rplaca l1 (car z))
64 (rplaca z y)
65 (rplacd l1 z)
66 (rplacd z nil)
67 (return l1))
68 (t (rplacd (Cnth z (sub1 (length z))) z)
69 (setq y (car l1))
70 (rplaca l1 (car z))
71 (rplaca z y)
72 (rplacd l1 (cdr z))
73 (rplacd z nil)
74 (return l1)))))
75 (setq l (cdr l))
76 (setq z (rplacd y z))
77 (go l1))))
78
79(def dsubst
80 (lambda (x y z)
81 (prog (b)
82 (cond ((eq y (setq b z)) (return (copy x))))
83 lp (cond ((atom z) (return b))
84 ((cond ((symbolp y) (eq y (car z))) (t (equal y (car z))))
85 (rplaca z (copy x)))
86 (t (dsubst x y (car z))))
87 (cond ((and y (eq y (cdr z))) (rplacd z (copy x)) (return b)))
88 (setq z (cdr z))
89 (go lp))))
90
91(putd 'eqstr (getd 'equal))
92
93; where are the functions this calls??
94(def every
95 (lambda
96 (everyx everyfn1 everyfn2)
97 (prog nil
98 a (cond ((null everyx) (return t))
99 ((funcall everyfn1 (car everyx))
100 (setq everyx
101 (cond ((null everyfn2) (cdr everyx))
102 (t (funcall everyfn2 everyx))))
103 (go a))
104 (t (return nil))))))
105(def insert
106 (lambda
107 (x l comparefn nodups)
108 (cond ((null l) (list x))
109 ((atom l)
110 (eprint l)
111 (error '"is an atom, can't be inserted into"))
112 (t (cond
113 ((null comparefn) (setq comparefn (function alphalessp))))
114 (prog (l1 n n1 y)
115 (setq l1 l)
116 (setq n (length l))
117 a (setq n1 (*quo (add1 n) 2))
118 (setq y (Cnth l1 n1))
119 (cond ((< n 3)
120 (cond ((funcall comparefn x (car y))
121 (cond
122 ((not
123 (and nodups (equal x (car y))))
124 (rplacd y (cons (car y) (cdr y)))
125 (rplaca y x))))
126 ((eq n 1) (rplacd y (cons x (cdr y))))
127 ((funcall comparefn x (cadr y))
128 (cond
129 ((not
130 (and nodups (equal x (cadr y))))
131 (rplacd (cdr y)
132 (cons (cadr y) (cddr y)))
133 (rplaca (cdr y) x))))
134 (t (rplacd (cdr y) (cons x (cddr y))))))
135 ((funcall comparefn x (car y))
136 (cond
137 ((not (and nodups (equal x (car y))))
138 (setq n (sub1 n1))
139 (go a))))
140 (t (setq l1 (cdr y)) (setq n (- n n1)) (go a))))
141 l))))
142
143(def kwote (lambda (x) (list 'quote x)))
144
145(def lconc
146 (lambda
147 (ptr x)
148 (prog (xx)
149 (return
150 (cond ((atom x) ptr)
151 (t (setq xx (last x))
152 (cond ((atom ptr) (cons x xx))
153 ((dtpr (cdr ptr))
154 (rplacd (cdr ptr) x)
155 (rplacd ptr xx))
156 (t (rplaca (rplacd ptr xx) x)))))))))
157
158(def ldiff
159 (lambda
160 (x y)
161 (cond ((eq x y) nil)
162 ((null y) x)
163 (t
164 (prog (v z)
165 (setq z (setq v (ncons (car x))))
166 loop (setq x (cdr x))
167 (cond ((eq x y) (return z))
168 ((null x) (error '"NOT A TAIL - LDIFF")))
169 (setq v (cdr (rplacd v (ncons (car x)))))
170 (go loop))))))
171
172
173(def lsubst
174 (lambda
175 (x y z)
176 (cond ((null z) nil)
177 ((atom z) (cond ((eq y z) x) (t z)))
178 ((equal y (car z)) (nconc (copy x) (lsubst x y (cdr z))))
179 (t (cons (lsubst x y (car z)) (lsubst x y (cdr z)))))))
180
181(def memcdr
182 (lambda
183 (%x% %y%)
184 (prog nil
185 l1 (cond ((eq %x% (cdr %y%)) (return t))
186 ((eq %x% %y%) (return nil)))
187 (setq %x% (cdr %x%))
188 (go l1))))
189
190(def merge
191 (lambda
192 (a b %%cfn)
193 (cond ((null %%cfn) (setq %%cfn (function alphalessp))))
194 (merge1 a b)))
195
196(def merge1
197 (lambda
198 (a b)
199 (cond ((null a) b)
200 ((null b) a)
201 (t
202 (prog (val end)
203 (setq val
204 (setq end
205 (cond ((funcall %%cfn (car a) (car b))
206 (prog1 a (setq a (cdr a))))
207 (t (prog1 b (setq b (cdr b)))))))
208 loop (cond ((null a) (rplacd end b) (return val))
209 ((null b) (rplacd end a) (return val))
210 ((funcall %%cfn (car a) (car b))
211 (rplacd end a)
212 (setq a (cdr a)))
213 (t (rplacd end b) (setq b (cdr b))))
214 (setq end (cdr end))
215 (go loop))))))
216
217(def notany
218 (lambda (somex somefn1 somefn2) (not (some somex somefn1 somefn2))))
219
220(def notevery
221 (lambda
222 (everyx everyfn1 everyfn2)
223 (not (every everyx everyfn1 everyfn2))))
224
225(def Cnth
226 (lambda
227 (x n)
228 (cond ((> 1 n) (cons nil x))
229 (t
230 (prog nil
231 lp (cond ((or (atom x) (eq n 1)) (return x)))
232 (setq x (cdr x))
233 (setq n (sub1 n))
234 (go lp))))))
235
236(def nthchar
237 (lambda
238 (x n)
239 (cond ((plusp n) (car (Cnth (explodec x) n)))
240 ((minusp n) (car (Cnth (reverse (explodec x)) (minus n))))
241 ((zerop n) nil))))
242
243(def prinlev
244 (lambda
245 ($%x $%n)
246 (cond ((not (dtpr $%x)) (print $%x))
247 ((and %trcflg (eq (car $%x) 'evl-trace) (dtpr (cdr $%x)))
248 (prinlev (cadr $%x) $%n))
249 ((and %trcflg
250 (eq (car $%x) '\#)
251 (dtpr (cdr $%x))
252 (dtpr (cddr $%x)))
253 (prinlev (caddr $%x) $%n))
254 ((eq %prevfn% $%x) (princ '//\#//))
255 ((eq $%n 0) (princ '"& "))
256 (t
257 (prog ($%kk $%cl)
258 (princ
259 (cond ($%dotflg (setq $%dotflg nil) '"... ")
260 (t '"(")))
261 (prinlev (car $%x) (sub1 $%n))
262 (setq $%kk $%x)
263 lp (cond
264 ((memcdr $%x $%kk)
265 (cond ($%cl (princ '" ...]") (return nil))
266 (t (setq $%cl t)))))
267 (cond ((not (*** eq (cdr $%kk) (unbound)))
268 (setq $%kk (cdr $%kk)))
269 (t (princ '" . unbound)") (return nil)))
270 (cond ((null $%kk) (princ '")") (return nil))
271 ((atom $%kk)
272 (princ '" . ")
273 (patom $%kk)
274 (princ '")")
275 (return nil)))
276 (princ '" ")
277 (prinlev (car $%kk) (sub1 $%n))
278 (go lp))))))
279
280(def printlev (lambda ($%x $%n) (terpri) (prinlev $%x $%n) $%x))
281
282
283
284(def remove
285 (lambda
286 (elt list)
287 (cond ((atom list) list)
288 ((equal (car list) elt) (remove elt (cdr list)))
289 ((cons (car list) (remove elt (cdr list)))))))
290
291(def some
292 (lambda
293 (somex somefn1 somefn2)
294 (prog nil
295 a (cond ((null somex) (return nil))
296 ((funcall somefn1 (car somex)) (return somex))
297 (t (setq somex
298 (cond ((null somefn2) (cdr somex))
299 (t (funcall somefn2 somex))))
300 (go a))))))
301
302; this probably should have another names since is ****
303; just a duplication of an existing function and since it has a
304; default second arg which I believe is not documented.
305(def sort
306 (lambda
307 (%%l %%cfn)
308 (prog (val n)
309 (cond ((null %%cfn) (setq %%cfn (function alphalessp))))
310 (setq n 0)
311 (setq val (sort1 0))
312 loop (cond ((null %%l) (return val))
313 (t (setq val (merge1 val (sort1 n)))
314 (setq n (add1 n))
315 (go loop))))))
316
317(def sort1
318 (lambda
319 (n)
320 (cond ((null %%l) nil)
321 ((zerop n)
322 (prog (run end)
323 (setq run %%l)
324 loop (setq end %%l)
325 (setq %%l (cdr %%l))
326 (cond ((or (null %%l)
327 (not (funcall %%cfn (car end) (car %%l))))
328 (rplacd end nil)
329 (return run))
330 (t (go loop)))))
331 (t (merge1 (sort1 (sub1 n)) (sort1 (sub1 n)))))))
332
333(def subpair
334 (lambda
335 (old new expr)
336 (cond (old (subpr expr old (or new '(nil)))) (t expr))))
337
338(def subpr
339 (lambda
340 (expr l1 l2)
341 (prog (d a)
342 (cond ((atom expr) (go lp))
343 ((setq d (cdr expr)) (setq d (subpr d l1 l2))))
344 (setq a (subpr (car expr) l1 l2))
345 (return
346 (cond ((or (neq a (car expr)) (neq d (cdr expr))) (cons a d))
347 (t expr)))
348 lp (cond ((null l1) (return expr))
349 (l2 (cond ((eq expr (car l1)) (return (car l2)))))
350 (t (cond ((eq expr (caar l1)) (return (cdar l1))))))
351 (setq l1 (cdr l1))
352 (and l2 (setq l2 (or (cdr l2) '(nil))))
353 (go lp))))
354
355(def tailp
356 (lambda
357 (x y)
358 (and x
359 (prog nil
360 lp (cond ((atom y) (return nil)) ((eq x y) (return x)))
361 (setq y (cdr y))
362 (go lp)))))
363
364(def tconc
365 (lambda
366 (p x)
367 (cond ((atom p) (cons (setq x (ncons x)) x))
368 ((dtpr (cdr p)) (rplacd p (cdr (rplacd (cdr p) (ncons x)))))
369 (t (rplaca p (cdr (rplacd p (ncons x))))))))
370
371(def ttyesno (lambda nil (yesno (read))))
372
373(def yesno (lambda (x) (selectq x ((t y yes) t) ((nil n no) nil) x)))
374
375; this really duplicates a function in auxfns1.l but this does more
376; error checking.
377(defun nth (N L)
378 (cond ((null L)nil)
379 (t(do ((LCDR L (cdr LCDR))
380 (COUNT N (1- COUNT)))
381 ((or (and (atom LCDR) LCDR
382 (err '"non-proper list passed to nth"))
383 (or (lessp COUNT 0)(zerop COUNT)))
384 (car LCDR))
385 nil))))
386(declare (special piport))
387(def dc-dskin ; LWE Hacking to compile OK
388 (nlambda (args)
389 (prog (tmp tmp1 tmp2)
390 (setq tmp
391 (prog (c cc)
392 (setq cc (get (car args) 'comment))
393 loop
394 (cond ((not cc)(return nil)))
395 (setq c (car cc))
396 (cond ((eq (car c)(cadr args))
397 (return nil)))
398 (setq cc (cdr cc))
399 (go loop)))
400 (setq tmp2 piport)
401 (setq tmp1 (get-comment 27 tmp2))
402 (cond (tmp (disgusting tmp
403 (cons (cadr args)
404 (cons (caddr args) tmp1))))
405 (t (putprop (car args)
406 (cons (cons (cadr args)
407 (cons (caddr args) tmp1))
408 (get (car args) 'comment))
409 'comment)))
410 (mark!changed (car args))
411 (return nil))))
412
413(def disgusting (lambda (a b) ; (rplaca a b)))
414b))
415
416(def get-comment
417 (lambda (stopper piport)
418 (prog (ans line)
419 (cond ((eq 10 (tyipeek piport)) (tyi piport)))
420 l: (setq line nil)
421; (until (member (car line) (list 10 stopper))
422; (setq line (cons (tyi piport) line)))
423 (prog nil loop
424 (cond ((member (car line)(list 10 stopper))
425 (return nil)))
426 (setq line (cons (tyi piport) line))
427 (go loop))
428 (setq ans (cons (implode (dreverse (cdr line))) ans))
429 (cond ((eq (car line) 10) (go l:)) (t (return (dreverse ans)))))))