|
|
1.1 root 1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; toplevel.l ;;;;;;;;;;;;;;;;;;;;;;;;;;;
2: ; Franz and UCI Lisp top level functions
3: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4: ; Copyright (c) 1983 , The Regents of the University of California.
5: ; All rights reserved.
6: ; Authors: Joseph Faletti and Michael Deering and John Foderaro.
7:
8: ;-------------------------------------------------------------------------
9: ; Top level functions for PEARL Joe Faletti, December 1981
10: ; modified from
11: ; Top level function for franz jkf, march 1980
12: ;
13: ; The following function contains the top-level read, eval, print
14: ; loop. With the help of the usual error handling functions,
15: ; pearl-break-err-handler and debug-err-handler, pearl-top-level provides
16: ; a reasonable environment for working with PEARL.
17: ;
18:
19: (defvar \$ldprint)
20:
21: ; Handle ^C with fixit.
22: (de pearl:int-serv (x)
23: (fixit nil))
24:
25: ; Before Opus 38.31:
26: ; (setq pearl-title (concat " plus PEARL " (status ctime)))
27: ; Moved to franz.l:
28: ; (setq pearl-title (concat " plus PEARL " (time-string)))
29:
30: (de read-in-initprl-file ()
31: (setq break-level-count 0 ; do this in case break
32: debug-level-count 0) ; occurs during readin
33: (*catch '(break-catch top-level-catch)
34: (do ((dirs `("." ,(getenv 'HOME)) (cdr dirs))
35: ; prevent warnings (from setdbsize in particular).
36: (*warn* nil *warn*)
37: (\$ldprint nil \$ldprint)) ; prevent messages
38: ((null dirs))
39: (cond ((do ((name '(".init.prl" "init.prl") (cdr name)))
40: ((null name))
41: (cond ((do ((ext '(".o" ".l" "") (cdr ext))
42: (file))
43: ((null ext))
44: (cond ((probef
45: (setq file (concat (car dirs)
46: "/"
47: (car name)
48: (car ext))))
49: (cond ((atom (errset (load file)))
50: (patom
51: "Error loading init.prl file ")
52: (print file)
53: (terpr)
54: (return 'error)))
55: (return t))))
56: (return t))))
57: (return t))))))
58:
59: (de read-in-startprl-file ()
60: (setq break-level-count 0 ; do this in case break
61: debug-level-count 0) ; occurs during readin
62: (*catch '(break-catch top-level-catch)
63: (do ((dirs `("." ,(getenv 'HOME)) (cdr dirs))
64: (\$ldprint nil \$ldprint)) ; prevent messages
65: ((null dirs))
66: (cond ((do ((name '(".start.prl" "start.prl") (cdr name)))
67: ((null name))
68: (cond ((do ((ext '(".o" ".l" "") (cdr ext))
69: (file))
70: ((null ext))
71: (cond ((probef
72: (setq file (concat (car dirs)
73: "/"
74: (car name)
75: (car ext))))
76: (cond ((atom (errset (load file)))
77: (patom
78: "Error loading start.prl file ")
79: (print file)
80: (terpr)
81: (return 'error)))
82: (return t))))
83: (return t))))
84: (return t))))))
85:
86: ; For the implementor who wishes to dump a PEARL.
87: (df savepearl (name)
88: (sstatus ignoreeof nil) ; to undo ~/.lisprc
89: (setq franz-not-virgin nil)
90: (aliasdef 'top-level 'pearl-top-level-init)
91: (setq \$gcprint nil)
92: (gc) ; garbage collect before dumping lisp
93: (cond (name (eval (list 'dumplisp (car name))))
94: ( t (dumplisp pearl)))
95: t)
96:
97: ; For the user who wishes to dump a PEARL that starts with .init.prl.
98: (de savefresh n
99: (prog (name)
100: ; (INITFN 'STARTUPPEARL)
101: (setq franz-not-virgin nil)
102: (aliasdef 'top-level 'pearl-top-level-init)
103: (setq \$gcprint nil)
104: (gc) ; garbage collect before dumping lisp
105: (cond ((\=& n 1) (setq name (arg 1)))
106: ((\=& n 2) (setq name (concat (arg 1) '|/| (arg 2))))
107: ( t (setq name 'pearl)))
108: (eval (list 'dumplisp name))
109: (return t)))
110:
111: ; For the user who wishes to dump a PEARL that continues with the
112: ; read-eval-print loop.
113: (de savecontinue n
114: (prog (name)
115: ; (INITFN 'PEARL-REP-LOOP)
116: (aliasdef 'top-level 'pearl-top-level)
117: (setq \$gcprint nil)
118: (gc) ; garbage collect before dumping lisp
119: (cond ((\=& n 1) (setq name (arg 1)))
120: ((\=& n 2) (setq name (concat (arg 1) '|/| (arg 2))))
121: ( t (setq name 'pearl)))
122: (eval (list 'dumplisp name))
123: (return t)))
124:
125: (de pearlreploop ()
126: (prog (*pval*)
127: *pearlloop*
128: (terpri)
129: (and *printhistorynumber*
130: (patom (1+ *historynumber*)))
131: (patom *pearlprompt*)
132: (setq *readlinechanged* nil)
133: (cond ((eq (unbound)
134: (setq *pval*
135: (car (errset (eval (addhistory (read)))))))
136: (rplacx (\\ *historynumber* *historysize*)
137: *histval*
138: (unbound))
139: (prin 'unbound))
140: ( t (rplacx (\\ *historynumber* *historysize*)
141: *histval*
142: *pval*)
143: (pearlprintfn *pval*)))
144: (go *pearlloop*)))
145:
146: (de pearl ()
147: (read-in-initprl-file)
148: (cond ((not (boundp '*db1size*))
149: (setdbsize 7.)))
150: (cond ((not (boundp '*db*))
151: (builddb *maindb*)
152: (setq *db* *maindb*)))
153: (cond ((not (boundp '*pearlprompt*))
154: (setq *pearlprompt* '|pearl> |))
155: ((null *pearlprompt*)
156: (setq *pearlprompt* '|-> |)))
157: (cond ((not (boundp '*historysize*))
158: (setq *historysize* 64.)))
159: (setq *historynumber* -1.)
160: (setq *history* (makhunk *historysize*))
161: (setq *histval* (makhunk *historysize*))
162: (read-in-startprl-file)
163: (terpri)
164: (pearlreploop))
165:
166: (de initpearl ()
167: (cond ((not (boundp '*db1size*))
168: (setdbsize 7.)))
169: (cond ((not (boundp '*db*))
170: (builddb *maindb*)
171: (setq *db* *maindb*))))
172:
173: (de pearl-top-level-init ()
174: (aliasdef 'reset 'franz-reset)
175: (aliasdef 'top-level 'pearl-top-level)
176: (signal 2 'pearl:int-serv)
177: (*catch '(top-level-catch break-catch)
178: (cond ((or (not (boundp 'franz-not-virgin))
179: (null franz-not-virgin))
180: (setq franz-not-virgin t
181: + nil ++ nil +++ nil
182: * nil ** nil *** nil)
183: ; This is changed because fixit is included now.
184: ; (setq ER%tpl 'pearl-break-err-handler)
185: (setq ER%tpl 'fixit)
186: (setq ER%brk 'fixit)
187: (setq ER%err 'fixit)
188:
189: ; The rest of the code should be within this
190: ; cond if autorunlisp existed
191: ; (cond ((not (autorunlisp))))
192: ;
193: (patom (status version))
194: (cond ((boundp 'franz-minor-version-number)
195: (patom franz-minor-version-number)))
196: (patom pearl-title)
197: (terpr)
198: (cond (*firststartup* (setq *firststartup* nil)
199: (read-in-initprl-file)))
200: (or *pearlprompt*
201: (setq *pearlprompt* '|-> |))
202: (and (not (\=& 64 *historysize*))
203: (setq *history* (makhunk *historysize*))
204: (setq *histval* (makhunk *historysize*)))
205: (read-in-startprl-file))))
206: (reset))
207:
208: (de pearl-top-level ()
209: ; loop forever
210: (do ((+*) (-) (retval))
211: (nil)
212: (setq retval
213: (*catch
214: '(top-level-catch break-catch)
215: ; begin or return to top level
216: (progn
217: (setq debug-level-count 0 break-level-count 0
218: evalhook nil funcallhook nil)
219: (cond (tpl-errlist (mapc 'eval tpl-errlist)))
220: (do ((^w nil nil))
221: (nil)
222: (cond (user-top-level (funcall user-top-level))
223: ( t ; Print prompt.
224: (and *printhistorynumber*
225: (patom (1+ *historynumber*)))
226: (patom *pearlprompt*)
227: (setq *readlinechanged* nil)
228:
229: (cond ((eq top-level-eof
230: ; read and add to history.
231: (setq -
232: (car (errset
233: (addhistory
234: (read nil
235: top-level-eof))))))
236: (cond ((not (status isatty))
237: (exit)))
238: (cond ((null (status ignoreeof))
239: (terpr)
240: (print 'Goodbye)
241: (terpr)
242: (exit))
243: ( t (terpr)
244: (setq - ''EOF)))))
245: ; Eval and story result in history.
246: (setq +* (eval -))
247: (rplacx (\\ *historynumber* *historysize*)
248: *histval*
249: +*)
250: ; update list of old forms
251: (let ((val -))
252: (let ((o+ +) (o++ ++))
253: (setq + val
254: ++ o+
255: +++ o++)))
256: ; update list of old values
257: (let ((val +*))
258: (let ((o* *) (o** **))
259: (setq * val
260: ** o*
261: *** o**)))
262: ; Don't print *invisible*.
263: (and (neq '*invisible* +*)
264: (pearlprintfn +*))
265: (terpr))))
266: (terpr)
267: (patom "[Return to top level]")
268: (terpr)
269: (cond ((eq 'reset retval) (old-reset-function))))))))
270:
271: ; this is the break handler, it should be tied to
272: ; ER%tpl always.
273: ; it is entered if there is an error which no one wants to handle.
274: ; We loop forever, printing out our error level until someone
275: ; types a ^D which goes to the next break level above us (or the
276: ; top-level if there are no break levels above us.)
277: ; a (return n) will return that value to the error message
278: ; which called us, if that is possible (that is if the error is
279: ; continuable)
280: ;
281: (def pearl-break-err-handler
282: (lexpr
283: (n)
284: ((lambda
285: (message break-level-count retval rettype ^w piport)
286: (cond ((>& n 0)
287: (print 'error:)
288: (mapc '(lambda (a) (patom " ") (patom a) )
289: (cdddr (arg 1)))
290: (terpr)
291: (cond ((caddr (arg 1)) (setq rettype 'contuab))
292: ( t (setq rettype nil))))
293: ( t (setq rettype 'localcall)))
294:
295: (do nil (nil)
296: (cond ((dtpr
297: (setq retval
298: (*catch
299: 'break-catch
300: (do ((form)) (nil)
301: (patom "<")
302: (patom break-level-count)
303: (patom ">: ")
304: (cond ((eq top-level-eof
305: (setq form (read nil top-level-eof)))
306: (cond ((null (status isatty))
307: (exit)))
308: (eval 1) ; force interrupt check
309: (return (1- break-level-count)))
310: ((and (dtpr form)
311: (eq 'return (car form)))
312: (cond ((or (eq rettype 'contuab)
313: (eq rettype 'localcall))
314: (return (ncons (eval (cadr form)))))
315: ( t (patom
316: "Can't continue from this error")
317: (terpr))))
318: ((and (dtpr form) (eq 'retbrk (car form)))
319: (cond ((numberp (setq form
320: (eval (cadr form))))
321: (return form))
322: ( t (return (1- break-level-count)))))
323: ( t (pearlbreakprintfn (eval form))
324: (terpr)))))))
325: (return (cond ((eq rettype 'localcall)
326: (car retval))
327: ( t retval))))
328: ((<& retval break-level-count)
329: (setq tpl-errlist errlist)
330: (*throw 'break-catch retval))
331: ( t (terpr)))))
332: nil
333: (1+ break-level-count)
334: nil
335: nil
336: nil
337: nil)))
338:
339: (aliasdef 'break-err-handler 'pearl-break-err-handler)
340:
341: ; vi: set lisp:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.