|
|
1.1 root 1: (setsyntax '";" 'splicing 'zapline)
2: ; editor from bbn-lisp c. 1968
3: ; (transcribed by R. Fateman for UNIX LISP, Oct., 1977)
4: ; (modified and enhanced by P. Pifer, May, 1978)
5: ; (corrected again by R. Fateman for VAX Unix Lisp, Dec., 1978)
6: ; (cleaned up, commented and compiled by J. Foderaro, Aug., 1979)
7: ; ( ... fixed bug in ^ command)
8: ;
9: (declare (special edok em pf pl l))
10:
11:
12: (setq printflag t)
13: ; print on by default
14:
15: (setq printlevel 3)
16:
17: (setq maxlevel 100)
18:
19: (setq findflag nil)
20:
21: (setq supereditflg t)(setq printflag t)(setq edrptcnt nil)
22:
23:
24: ;--- remedit - removes all traces of the editor from the oblist.
25: ; Note that if the editor is compiled, the code space
26: ; will not be reclaimed
27: ;
28: (def remedit
29: (lambda nil
30: (prog nil
31: (mapc (function (lambda (x) (set x nil)))
32: '(editmacros findflag supereditflg edrptcnt
33: printflag printlevel maxlevel))
34: (mapc (function (lambda (x) (putd x nil)))
35: '(editf editv tconc eprint eprint1 printlevel dsubst
36: editcoms edit1f edit2f edit2af edit4e
37: editqf edit4e edit4f edit4f1 editnth bpnt
38: bpnt0 subpair subpr ri ro li lo bi bo
39: ldiff nthcdr attach edite editcom editdefault
40: remedit))
41: (return 'gone))))
42:
43: ;--- subst - a - newval
44: ; - b : oldvall
45: ; - c : string
46: ; substitute a for b in c
47: ;
48: (def subst
49: (lambda (a b c)
50: (cond ((equal b c) a)
51: ((atom c) c)
52: (t (cons (subst a b (car c)) (subst a b (cdr c)))))))
53:
54: (def tconc
55: (lambda (x p)
56: (cond ((null (car p))
57: (rplacd p (car (rplaca p (list x)))))
58: (t (rplacd p (cdr (rplacd (cdr p) (list x))))))))
59:
60: ;--- printlevel - x : new value
61: ; set the printlevel to x and return the old value
62: ; [change this to prog1 ]
63: ;
64: (def printlevel
65: (lambda (x)
66: (prog (a)
67: (setq a printlevel)
68: (setq printlevel x)
69: (return a))))
70:
71: ;--- editf - funcname : name of function to edit
72: ; - [cmds] : commands to apply right away
73: ; This is the starting point in the editor. You specify the
74: ; file you wish to edit and perhaps some initial commands to
75: ; the editor. If the function is not machine coded you
76: ; enter the editor.
77: ;
78: (def editf
79: (nlambda (x)
80: (prog (a c)
81: (setq a (getd (car x)))
82: (cond ((or (null a) (bcdp a))
83: (return '(not editable))))
84: (putd (car x) (car (edite a (cdr x) nil)))
85: (return (car x)))))
86:
87: '(def dsubst
88: (lambda (x y z)
89: (prog nil
90: (cond ((null z) (return z))
91: ((equal y (car z)) (rplaca z x) (go l)))
92: (cond ((null (atom (car z))) (dsubst x y (car z))))
93: l (dsubst x y (cdr z))
94: (return z))))
95:
96: ;--- dsubst - x : oldval
97: ; - y : newval
98: ; - z : form
99: ; directly substitutes all occurances of x in form z with y.
100: ; It uses rplaca and does not copy the structure.
101: ;
102: (def dsubst
103: (lambda (x y z)
104: (cond ((dptr z)
105: (cond ((equal y (car z))
106: (rplaca (car z) x))
107: (t (dsubst x y (car z)))))
108: (t z))
109: (dsubst x y (cdr z))
110: z))
111:
112:
113: (def editcoms (lambda (c) (mapc (function editcom) c)))
114:
115: (def edit1f
116: (lambda (c l)
117: (cond ((equal c 0)
118: (cond ((null (cdr l)) (err nil))
119: (t (cdr l))))
120: ((greaterp c 0)
121: (cond ((greaterp c (length (car l))) (err nil))
122: (t (cons (car (nthcdr (sub1 c) (car l) )) l))))
123: ((greaterp (times c -1) (length (car l)))
124: (err nil))
125: (t (cons (car (nthcdr (plus (length (car l)) c) (car l) ))
126: l)))))
127:
128: (def edit2f
129: (lambda (c)
130: (cond ((greaterp (car c) 0)
131: (cond ((greaterp (car c) (length (car l)))
132: (err nil))
133: (t (rplaca l (edit2af (sub1 (car c))
134: (car l)
135: (cdr c)
136: nil)))))
137: ((or (equal (car c) 0)
138: (null (cdr c))
139: (greaterp (times -1 (car c)) (length (car l))))
140: (err nil))
141: (t (rplaca l (edit2af (sub1 (times -1 (car c)))
142: (car l)
143: (cdr c)
144: t))))))
145:
146: (def edit2af
147: (lambda (n x r d)
148: (prog nil
149: (cond ((null (equal n 0))
150: (rplacd (nthcdr (sub1 n) x)
151: (nconc r
152: (cond (d (nthcdr n x))
153: (t (nthcdr (add1 n) x ))))))
154: (d (attach (car r) x)
155: (rplacd x (nconc (cdr r) (cdr x))))
156: (r (rplaca x (car r))
157: (rplacd x (nconc (cdr r) (cdr x))))
158: (t (print (list 'aha x))
159: (rplaca x (cadr x))
160: (rplacd x (cddr x))))
161: (return x))))
162:
163: (def edit4e
164: (lambda (x y)
165: (cond ((equal x y) t)
166: ((atom x) (eq x '&))
167: ((atom y) nil)
168: ((edit4e (car x) (car y))
169: (or (eq (cadr x) '-)
170: (edit4e (cdr x) (cdr y)))))))
171:
172: (def editqf
173: (lambda (s)
174: (prog (q1)
175: (return (cond ((setq q1 (member s (cdar l)))
176: (setq l (cons q1 l)))
177: (t (edit4f s 'n)
178: (cond ((not (atom s))
179: (setq l (cons (caar l) l))))))))))
180:
181: (def edit4f
182: (lambda (s n)
183: (prog (ff ll x)
184: (setq ll (cond ((eq n 'n) (cons (caar l) l))
185: (t l)))
186: (setq x (car ll))
187: (setq ff (cons nil nil))
188: (cond ((and n (not (numberp n))) (setq n 1)))
189: lp (cond ((edit4f1 s x maxlevel)
190: (setq l (nconc (car ff) ll))
191: (return (car l)))
192: ((null n) (err nil)))
193: lp1 (setq x (car ll))
194: (cond ((null (setq ll (cdr ll))) (err nil))
195: ((and (setq x (member x (car ll)))
196: (null (atom (setq x (cdr x)))))
197: (go lp)))
198: (go lp1))))
199:
200: (def edit4f1
201: (lambda (s a lvl)
202: (prog nil
203: (cond ((null (greaterp lvl 0)) (return nil)))
204: lp (cond ((atom a) (return nil))
205: ((and (edit4e s (car a))
206: (or (null n)
207: (equal 0 (setq n (sub1 n)))))
208: (return (tconc a ff)))
209: ((and s
210: (equal s (cdr a))
211: (or (null n)
212: (equal 0 (setq n (sub1 n)))))
213: (return (tconc a ff)))
214: ((and n
215: (edit4f1 s (car a) (sub1 lvl))
216: (equal 0 n))
217: (return (tconc (car a) ff))))
218: (setq a (cdr a))
219: (go lp))))
220:
221: (def editnth
222: (lambda (x n)
223: (cond ((null (setq n (cond ((or (null (lessp n 0))
224: (greaterp (setq n
225: (plus (length x)
226: n
227: 1))
228: 0))
229: (nthcdr (sub1 n) x)))))
230: (err nil))
231: (t n))))
232:
233: (def bpnt
234: (lambda (x)
235: (prog (y n)
236: (cond ((equal 0 (car x)) (setq y (car l)))
237: (t (setq y (car (editnth (car l) (car x))))))
238: (cond ((null (cdr x)) (setq n 3))
239: ((null (numberp (cadr x))) (go b1))
240: ((lessp (cadr x) 0)
241: (setq n (plus (cadr x) 2)))
242: (t (setq n (cadr x))))
243: (return (bpnt0 y 1 n))
244: b1 (err nil))))
245:
246: (def bpnt0
247: (lambda (l n d)
248: (prog (oldl)
249: (setq oldl (printlevel (difference d n)))
250: (cond ((atom (errset (eprint l) t))
251: (terpri)
252: (terpri)))
253: (printlevel oldl)
254: (return nil))))
255:
256:
257: (def ro
258: (lambda (n x)
259: (prog (a)
260: (setq a (editnth x n))
261: (cond ((or (null a) (atom (car a))) (err nil)))
262: (rplacd (last (car a)) (cdr a))
263: (rplacd a nil))))
264:
265: (def ri
266: (lambda (m n x)
267: (prog (a b)
268: (setq a (editnth x m))
269: (setq b (editnth (car a) n))
270: (cond ((or (null a) (null b)) (err nil)))
271: (rplacd a (nconc (cdr b) (cdr a)))
272: (rplacd b nil))))
273:
274: (def li
275: (lambda (n x)
276: (prog (a)
277: (setq a (editnth x n))
278: (cond ((null a) (err nil)))
279: (rplaca a (cons (car a) (cdr a)))
280: (rplacd a nil))))
281:
282: (def lo
283: (lambda (n x)
284: (prog (a)
285: (setq a (editnth x n))
286: (cond ((or (null a) (atom (car a))) (err nil)))
287: (rplacd a (cdar a))
288: (rplaca a (caar a)))))
289:
290: (def bi
291: (lambda (m n x)
292: (prog (a b)
293: (setq b (cdr (setq a (editnth x n))))
294: (setq x (editnth x m))
295: (cond ((and a (null (greaterp (length a) (length x))))
296: (rplacd a nil)
297: (rplaca x (cons (car x) (cdr x)))
298: (rplacd x b))
299: (t (err nil))))))
300:
301: (def bo
302: (lambda (n x)
303: (prog nil
304: (setq x (editnth x n))
305: (cond ((atom (car x)) (err nil)))
306: (rplacd x (nconc (cdar x) (cdr x)))
307: (return (rplaca x (caar x))))))
308:
309: (def subpair
310: (lambda (x y z fl)
311: (cond (fl (subpr x y (copy z)))
312: ((subpr x y z)))))
313:
314: (def subpr
315: (lambda (x y z)
316: (prog (c d)
317: (setq c x)
318: (setq d y)
319: loop (cond ((or (null c) (null d)) (return z))
320: (t (dsubst (car d) (car c) z)
321: (setq c (cdr c))
322: (setq d (cdr d))
323: (go loop))))))
324:
325: (def ldiff
326: (lambda (x y)
327: (prog (a b)
328: (setq a x)
329: (setq b nil)
330: loop (cond ((equal a y) (return (reverse b)))
331: ((null a) (return (err nil)))
332: (t (setq b (cons (car a) b))
333: (setq a (cdr a))
334: (go loop))))))
335:
336: (def editv
337: (nlambda (editvx)
338: (prog nil
339: (set (car editvx)
340: (car (edite (eval (car editvx))
341: (cdr editvx)
342: nil)))
343: (return (car editvx)))))
344:
345: (def nthcdr
346: (lambda (n x)
347: (cond ((equal n 0) x)
348: ((lessp n 0) (cons nil x))
349: (t (nthcdr (sub1 n)(cdr x))))))
350:
351: (def attach
352: (lambda (x y)
353: (prog (a)
354: (setq a (cons (car y) (cdr y)))
355: (rplaca y x)
356: (rplacd y a)
357: (return y))))
358:
359: (def eprint (lambda (x) (print (eprint1 x printlevel))))
360:
361: (def edite
362: (lambda (x ops l)
363: (prog (c m em edok copied pf pl)
364: (cond ((null l) (setq l (list x))))
365: (setq em editmacros)
366: (setq pf printflag)
367: (setq pl 3)
368: (cond (ops (cond ((dtpr (errset (mapc
369: (function
370: (lambda (x)
371: (editcom (setq c x))))
372: ops)
373: t))
374: (return (car (last l))))
375: (t (go b)))))
376: (print 'edit)
377: (cond (pf (terpri) (editcom 'p)))
378: (setq pf printflag)
379: ct (setq findflag nil)
380: a (cond (edok (return (cdr edok))))
381: (terpri)
382: (patom '*)
383: (drain)
384: (cond ((atom (errset (setq c (read)) t)) (go ct)))
385: (cond ((dtpr (errset (editcom c) t))
386: (cond (pf (editcom 'p)))
387: (setq pf printflag)
388: (go a)))
389: b (terpri)
390: (print c)
391: (patom '?)
392: (terpri)
393: (go ct))))
394:
395: (def editdefault
396: (lambda (x) (editcom (list 'f x 't))))
397:
398: (def editcom
399: (lambda (c)
400: (prog (cc c2 c3 cl)
401: a (cond (findflag (setq findflag nil) (editqf c))
402: ((numberp c) (setq l (edit1f c l)))
403: ((atom c)
404: (cond ((eq c 'ok)
405: (setq ersetflg t)
406: (setq edok (cons t (last l)))
407: (return (setq pf nil)))
408: ((eq c 'e)
409: (setq ersetflg t)
410: (print (eval (read)))
411: (terpri))
412: ((eq c 'p)
413: (setq pf nil)
414: (bpnt0 (car l) 1 pl))
415: ((eq c 'pp)
416: (setq pf nil)
417: (terpri)
418: (errset ($prpr (car l)) t)
419: (terpri))
420: ((eq c 'mark)
421: (setq m (cons l m)))
422: ((eq c '^)
423: (setq l (list (last l))))
424: ((eq c 'copy) (setq copied (copy l)))
425: ((eq c 'restore) (setq l copied))
426: ((eq c '<)
427: (cond (m (setq l (car m)))
428: (t (err '"no marks"))))
429: ((eq c '<<)
430: (cond (m (setq l (car m))
431: (setq m (cdr m)))
432: (t (err '"no marks"))))
433: ((eq c 'poff)
434: (setq pf nil)
435: (setq printflag nil))
436: ((eq c 'pon)
437: (setq pf t)
438: (setq printflag t))
439: (t (cond ((and (setq cc
440: (cond ((null
441: (setq cc
442: (assoc c em)))
443: nil)
444: ((cdr cc))))
445: (null (car cc)))
446: (editcoms (copy cc)))
447: (t (return (editdefault c)))))))
448: ((numberp (setq cc (car c))) (edit2f c))
449: (t (setq c2 (cadr c))
450: (setq c3
451: (cond ((null (cddr c)) nil)
452: ((car (cddr c)))))
453: (setq cl (car l))
454: (cond ((eq cc 's)
455: (set c2
456: (car (cond ((null (setq c c3)) l)
457: ((equal c 0) l)
458: (t (editnth cl c))))))
459: ((eq cc 'r)
460: (dsubst c3 c2 cl))
461: ((eq cc 'e)
462: (setq cc (eval c2))
463: (cond ((null (cddr c))
464: (print cc)
465: (terpri)))
466: (return cc))
467: ((eq cc 'i)
468: (setq c
469: (cons (cond ((atom c2) c2)
470: (t (eval c2)))
471: (mapcar (function eval)
472: (cddr c))))
473: (go a))
474: ((eq cc 'n)
475: (nconc cl (cdr c)))
476: ((eq cc 'p)
477: (bpnt (cdr c))
478: (setq pf nil))
479: ((eq cc 'f)
480: (edit4f c2 c3))
481: ((eq cc 'nth)
482: (setq l (cons (editnth cl c2) l)))
483: ((member cc
484: '(ri ro li lo bi bo))
485: (apply1 cc (append (cdr c) (list cl))))
486: ((member cc '(m d))
487: (setq cc (cond ((atom (setq cc c2))
488: (cons cc
489: (cons nil
490: (cddr c))))
491: (t (cons (car cc) (cddr c)))))
492: (setq em (cons cc em))
493: (cond ((eq (car c) 'm)
494: (setq editmacros
495: (cons cc editmacros)))))
496: ((eq cc 'pl)
497: (cond ((lessp c2 1) (err nil))
498: (t (setq pl (add 1 c2)))))
499: (t (cond ((or (null
500: (setq cc
501: (cond ((null
502: (setq cc
503: (assoc cc em)))
504: nil)
505: (t (cdr cc)))))
506: (null (cond ((null cc) nil)
507: (t (car cc)))))
508: (return (editdefault c)))
509: ((atom (car cc))
510: (editcoms
511: (subst (cond ((null c) nil)
512: ((cdr c)))
513: (car cc)
514: (cdr cc))))
515: (t (editcoms
516: (subpair (car cc)
517: (cdr c)
518: (cdr cc)
519: t))))))))
520: (return (car l)))))
521:
522: (def eprint1
523: (lambda (x lev)
524: (cond ((atom x) x)
525: ((equal 0 lev) '&)
526: ((and (atom (cdr x)) (cdr x)) x)
527: (t (mapcar (function (lambda (y) (eprint1 y (sub1 lev))))
528: x)))))
529:
530: (def assoc
531: (lambda (e l)
532: (cond ((null l) nil)
533: ((equal e (caar l)) (car l))
534: (t (assoc e (cdr l))))))
535:
536: (def apply1
537: (lambda (f l)
538: (eval (cons f (mapcar '(lambda (z) (list 'quote z))
539: l)))))
540:
541:
542:
543:
544: (def editp
545: (nlambda (x)
546: (prog (a b)
547: (setq a (car x))
548: (edite (caar x))
549: (return a))))
550:
551: (def makefile
552: (nlambda (x)
553: (prog (poport n f ff l df)
554: (setq l (cons nil (cadr x)))
555: (setq ff (eval (car x)))
556: (setq poport
557: (outfile (setq n (concatp 'mkfl))))
558: l1 (cond ((null (setq l (cdr l))) (go e1)))
559: (setq f (car l))
560: (cond ((null f) (go l1))
561: ((null (setq df (getd f))) (go l1))
562: (t (setq df (list 'def f df))
563: ($prpr df)
564: (terpri)
565: (go l1)))
566: e1 (close poport)
567: (null (eval (cons 'exec (cons '/bin/mv (cons n (cons ff nil)))))))))
568:
569: (def appfile
570: (nlambda (x)
571: (prog (i poport n f ff l df)
572: (setq l (cons nil (cadr x)))
573: (setq ff (eval (car x)))
574: (setq i (infile ff))
575: (setq poport
576: (outfile (setq n (concatp 'apfl))))
577: l1 (cond ((eq (setq f (read i poport)) 'eof)
578: (go l2))
579: (t ($prpr f) (terpri)))
580: (go l1)
581: l2 (cond ((null (setq l (cdr l))) (go e1)))
582: (setq f (car l))
583: (cond ((null f) (go l2))
584: ((null (setq df (getd f))) (go l2))
585: (t (setq df (list 'def f df))
586: ($prpr df)
587: (terpri)
588: (go l2)))
589: e1 (close poport)
590: (null (eval (cons 'exec (cons '/bin/mv (cons n (cons ff nil)))))))))
591:
592: (def exec
593: (nlambda ($list)
594: (prog ($handy)
595: (setq $handy '"")
596: loop (cond ((null $list)
597: (return (eval (list 'process $handy))))
598: (t (setq $handy
599: (concat (concat $handy (car $list))
600: '" "))
601: (setq $list (cdr $list))
602: (go loop))))))
603:
604: (setq editmacros nil)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.