comparison lisp/ilisp/ild.mail @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children b82b59fe008d
comparison
equal deleted inserted replaced
-1:000000000000 0:376386a54a3c
1 From @yonge.csri.toronto.edu:qobi@csri.toronto.edu Sun Jul 3 00:43:43 1994
2 From: Jeffrey Mark Siskind <qobi@csri.toronto.edu>
3 To: rfb@lehman.com (Rick Busdiecker)
4 Cc: marcoxa@cs.NYU.EDU
5 In-Reply-To: rfb@lehman.com's message of Wed, 29 Jun 1994 19:21:41 GMT
6 Subject: ILISP
7 Reply-To: Qobi@CS.Toronto.EDU
8 Date: Sun, 3 Jul 1994 00:43:19 -0400
9
10 I think it is great that you are willing to maintain ILisp. ILisp is the most
11 viable Lisp development environment available. I use it many hours a day.
12
13 I'd like to contribute an addition to ILisp. I wrote a package that uses a
14 standard set of single-keystroke bindings to interface with a variety of
15 different debuggers. It is vaguely modelled after the Symbolics debugger. It
16 provides two key advantages: single keystrokes for moving up and down the
17 stack, and a uniform interface to different debuggers. I find that useful
18 since I often work simultaneously with different Lisps and can never remember
19 the particulars of each one's debugger.
20
21 Anyway, I think that it would be of great use to others. It shouldn't take you
22 very long to `officially' integrate it with ILisp. It basically works already
23 with Lucid, Allegro, CMUCL, and AKCL and is fairly reliable. I've used it for
24 years already. Not all debugger commands are available in all implementations.
25 Some are but I didn't know how to get them to work. These are noted in the
26 code. If you know how to fix them that would be great.
27
28 I also have written an improved debugger for use with Scheme->C along with an
29 interface between that debugger and ILD. There are still some problems that I
30 have to iron out though before I release that code.
31
32 I hereby give you permission to distribute this code to anyone subject to the
33 restrictions that it is available on an as is basis with no guarantee of its
34 correctness of suitability for any purpose, that I am not held liable for
35 damages resulting from its use, and that I be given credit by name for this
36 contribution.
37 Jeff (home page http://www.cdf.toronto.edu:/DCS/Personal/Siskind.html)
38 -------------------------------------------------------------------------------
39 ;;; ILD: A common Common Lisp debugger user interface for ILisp.
40 ;;; ---Jeffrey Mark Siskind
41
42 ;;; Keystroke c-u? What it does
43 ;;; ---------------------------------------------------------
44 ;;; m-a Abort
45 ;;; m-c Continue
46 ;;; c-m-n * Next stack frame
47 ;;; c-m-p * Previous stack frame
48 ;;; c-c < Top stack frame
49 ;;; c-c > Bottom stack frame
50 ;;; m-b Backtrace
51 ;;; c-m-d Display all locals
52 ;;; c-m-l * Display particular local
53 ;;; c-c r Return
54 ;;; c-m-r Retry
55 ;;; c-x t Trap on exit
56 ;;; c-c L Select Lisp interaction buffer
57 ;;; c-z c-s Sets compiler options for maximally debuggablity
58 ;;; c-z c-f Sets compiler options for fastest but least debuggable code
59
60 (require 'ilisp)
61
62 (deflocal ild-abort-string nil)
63 (deflocal ild-continue-string nil)
64 (deflocal ild-next-string nil)
65 (deflocal ild-next-string-arg nil)
66 (deflocal ild-previous-string nil)
67 (deflocal ild-previous-string-arg nil)
68 (deflocal ild-top-string nil)
69 (deflocal ild-bottom-string nil)
70 (deflocal ild-backtrace-string nil)
71 (deflocal ild-locals-string nil)
72 (deflocal ild-local-string-arg nil)
73 (deflocal ild-return-string nil)
74 (deflocal ild-retry-string nil)
75 (deflocal ild-trap-on-exit-string nil)
76
77 (defun ild-debugger-command (string)
78 (process-send-string (get-buffer-process (current-buffer))
79 (format "%s\n" string)))
80
81 (defun ild-prompt ()
82 (save-excursion
83 (beginning-of-line)
84 (comint-skip-prompt)
85 (eobp)))
86
87 (defun ild-abort ()
88 (interactive)
89 (if ild-abort-string
90 (ild-debugger-command ild-abort-string)
91 (beep)))
92
93 (defun ild-continue (&optional arg)
94 (interactive "P")
95 (if (ild-prompt)
96 (if ild-continue-string
97 (ild-debugger-command ild-continue-string)
98 (beep))
99 (if arg (capitalize-word arg) (capitalize-word 1))))
100
101 (defun ild-next (&optional arg)
102 (interactive "P")
103 (if arg
104 (if ild-next-string-arg
105 (ild-debugger-command (format ild-next-string-arg arg))
106 (beep))
107 (if ild-next-string
108 (ild-debugger-command ild-next-string)
109 (beep))))
110
111 (defun ild-previous (&optional arg)
112 (interactive "P")
113 (if arg
114 (if ild-previous-string-arg
115 (ild-debugger-command (format ild-previous-string-arg arg))
116 (beep))
117 (if ild-previous-string
118 (ild-debugger-command ild-previous-string)
119 (beep))))
120
121 (defun ild-top (&optional arg)
122 (interactive "P")
123 (if ild-top-string
124 (ild-debugger-command ild-top-string)
125 (beep)))
126
127 (defun ild-bottom (&optional arg)
128 (interactive "P")
129 (if ild-bottom-string
130 (ild-debugger-command ild-bottom-string)
131 (beep)))
132
133 (defun ild-backtrace (&optional arg)
134 (interactive "P")
135 (if (ild-prompt)
136 (if ild-backtrace-string
137 (ild-debugger-command ild-backtrace-string)
138 (beep))
139 (if arg (backward-word arg) (backward-word 1))))
140
141 (defun ild-locals (&optional arg)
142 (interactive "P")
143 (if ild-locals-string
144 (ild-debugger-command ild-locals-string)
145 (beep)))
146
147 (defun ild-local (&optional arg)
148 (interactive "P")
149 (if arg
150 (if ild-local-string-arg
151 (ild-debugger-command (format ild-local-string-arg arg))
152 (beep))
153 (if ild-locals-string
154 (ild-debugger-command ild-locals-string)
155 (beep))))
156
157 (defun ild-return ()
158 (interactive)
159 (if ild-return-string
160 (ild-debugger-command ild-return-string)
161 (beep)))
162
163 (defun ild-retry ()
164 (interactive)
165 (if ild-retry-string
166 (ild-debugger-command ild-retry-string)
167 (beep)))
168
169 (defun ild-trap-on-exit (&optional arg)
170 (interactive "P")
171 (if ild-trap-on-exit-string
172 (ild-debugger-command ild-trap-on-exit-string)
173 (beep)))
174
175 (defun fast-lisp ()
176 "Use the production compiler."
177 (interactive)
178 (ilisp-send "(progn (proclaim '(optimize (speed 3) (safety 0) (space 0) (compilation-speed 0) (debug 0))) #+akcl (use-fast-links t))"))
179
180 (defun slow-lisp ()
181 "Use the development compiler."
182 (interactive)
183 (ilisp-send "(progn (proclaim '(optimize (speed 0) (safety 3) (space 3) (compilation-speed 3) (debug 3))) #+akcl (use-fast-links nil))"))
184
185 (defun select-lisp ()
186 "Select the lisp buffer in one window mode"
187 (interactive)
188 (cond ((and (lisp-mem ilisp-buffer
189 (buffer-list)
190 (function (lambda (x y) (equal x (buffer-name y)))))
191 (get-buffer-process (get-buffer ilisp-buffer)))
192 (delete-other-windows)
193 (switch-to-buffer ilisp-buffer))
194 (t (lucid) ;put your favorite Lisp here
195 (delete-other-windows))))
196
197 (defun select-ilisp (arg)
198 "Select the current ILISP buffer."
199 (interactive "P")
200 (if (and (not arg)
201 (lisp-mem
202 (buffer-name (current-buffer))
203 ilisp-buffers
204 (function (lambda (x y) (equal x (format "*%s*" (car y)))))))
205 (setq ilisp-buffer (buffer-name (current-buffer)))
206 (let ((new (completing-read
207 (if ilisp-buffer
208 (format "Buffer [%s]: "
209 (substring ilisp-buffer 1
210 (1- (length ilisp-buffer))))
211 "Buffer: ")
212 ilisp-buffers nil t)))
213 (if (not (zerop (length new)))
214 (setq ilisp-buffer (format "*%s*" new))))))
215
216 ;;; This fixes a bug in ILISP 4.1
217
218 (defun defkey-ilisp (key command &optional inferior-only)
219 "Define KEY as COMMAND in ilisp-mode-map and lisp-mode-map unless
220 optional INFERIOR-ONLY is T. If the maps do not exist they will be
221 created. This should only be called after ilisp-prefix is set to the
222 desired prefix."
223 (if (not ilisp-mode-map) (ilisp-bindings))
224 (define-key ilisp-mode-map key command)
225 (if (not inferior-only) (define-key lisp-mode-map key command)))
226
227 ;;; This is a convenient command since c-Z c-W doesn't default to the whole
228 ;;; buffer if there is no region
229
230 (defun compile-buffer ()
231 "Compile the current buffer"
232 (interactive)
233 (compile-region-and-go-lisp (point-min) (point-max)))
234
235 (defkey-ilisp "\M-a" 'ild-abort t)
236 (defkey-ilisp "\M-c" 'ild-continue t)
237 (defkey-ilisp "\C-\M-n" 'ild-next t)
238 (defkey-ilisp "\C-\M-p" 'ild-previous t)
239 (defkey-ilisp "\C-c<" 'ild-top t)
240 (defkey-ilisp "\C-c>" 'ild-bottom t)
241 (defkey-ilisp "\M-b" 'ild-backtrace t)
242 (defkey-ilisp "\C-\M-d" 'ild-locals t)
243 (defkey-ilisp "\C-\M-l" 'ild-local t)
244 (defkey-ilisp "\C-cr" 'ild-return t)
245 (defkey-ilisp "\C-\M-r" 'ild-retry t)
246 (defkey-ilisp "\C-xt" 'ild-trap-on-exit t)
247 (define-key global-map "\C-cL" 'select-lisp)
248 (ilisp-defkey lisp-mode-map "\C-f" 'fast-lisp)
249 (ilisp-defkey ilisp-mode-map "\C-f" 'fast-lisp)
250 (ilisp-defkey lisp-mode-map "\C-s" 'slow-lisp)
251 (ilisp-defkey ilisp-mode-map "\C-s" 'slow-lisp)
252
253 (defdialect clisp "Common LISP" ilisp
254 (setq ilisp-load-or-send-command
255 "(or (and (load \"%s\" :if-does-not-exist nil) t)
256 (and (load \"%s\" :if-does-not-exist nil) t))")
257 (ilisp-load-init 'clisp "clisp")
258 (setq ilisp-package-regexp "^[ \t]*(in-package[ \t\n]*"
259 ilisp-package-command "(let ((*package* *package*)) %s (package-name *package*))"
260 ilisp-package-name-command "(package-name *package*)"
261 ilisp-in-package-command "(in-package \"%s\")"
262 ilisp-last-command "*"
263 ilisp-save-command "(progn (ILISP:ilisp-save) %s\n)"
264 ilisp-restore-command "(ILISP:ilisp-restore)"
265 ilisp-block-command "(progn %s\n)"
266 ilisp-eval-command "(ILISP:ilisp-eval \"%s\" \"%s\" \"%s\")"
267 ilisp-defvar-regexp "(defvar[ \t\n]")
268 (setq ilisp-defvar-command
269 "(ILISP:ilisp-eval \"(let ((form '%s)) (progn (makunbound (second form)) (eval form)))\" \"%s\" \"%s\")")
270 (setq ilisp-compile-command "(ILISP:ilisp-compile \"%s\" \"%s\" \"%s\")"
271 ilisp-describe-command "(ILISP:ilisp-describe \"%s\" \"%s\")"
272 ilisp-inspect-command "(ILISP:ilisp-inspect \"%s\" \"%s\")"
273 ilisp-arglist-command "(ILISP:ilisp-arglist \"%s\" \"%s\")")
274 (setq ilisp-documentation-types
275 '(("function") ("variable")
276 ("structure") ("type")
277 ("setf") ("class")
278 ("(qualifiers* (class ...))")))
279 (setq ilisp-documentation-command
280 "(ILISP:ilisp-documentation \"%s\" \"%s\" \"%s\")")
281 (setq ilisp-macroexpand-1-command
282 "(ILISP:ilisp-macroexpand-1 \"%s\" \"%s\")")
283 (setq ilisp-macroexpand-command "(ILISP:ilisp-macroexpand \"%s\" \"%s\")")
284 (setq ilisp-complete-command
285 "(ILISP:ilisp-matching-symbols \"%s\" \"%s\" %s %s %s)")
286 (setq ilisp-locator 'lisp-locate-clisp)
287 (setq ilisp-source-types
288 '(("function") ("macro") ("variable")
289 ("structure") ("type")
290 ("setf") ("class")
291 ("(qualifiers* (class ...))")))
292 (setq ilisp-callers-command "(ILISP:ilisp-callers \"%s\" \"%s\")"
293 ilisp-trace-command "(ILISP:ilisp-trace \"%s\" \"%s\" \"%s\")"
294 ilisp-untrace-command "(ILISP:ilisp-untrace \"%s\" \"%s\")")
295 (setq ilisp-directory-command "(namestring *default-pathname-defaults*)"
296 ilisp-set-directory-command
297 "(setq *default-pathname-defaults* (parse-namestring \"%s\"))")
298 (setq ilisp-load-command "(load \"%s\")")
299 (setq ilisp-compile-file-command
300 "(ILISP:ilisp-compile-file \"%s\" \"%s\")"))
301
302 (defdialect lucid "Lucid Common LISP" clisp
303 (ilisp-load-init 'lucid "lucid")
304 (setq comint-prompt-regexp "^\\(->\\)+ \\|^[^> ]*> "
305 comint-fix-error ":a"
306 ilisp-reset ":a :t"
307 comint-continue ":c"
308 comint-interrupt-regexp ">>Break: Keyboard interrupt"
309 comint-prompt-status
310 (function (lambda (old line)
311 (comint-prompt-status old line 'lucid-check-prompt))))
312 (setq ilisp-error-regexp "ILISP:[^\"]*\\|>>[^\n]*")
313 (setq ilisp-source-types (append ilisp-source-types '(("any"))))
314 (setq ilisp-find-source-command
315 "(ILISP:ilisp-source-files \"%s\" \"%s\" \"%s\")")
316 (setq ilisp-binary-command
317 "(first (last lucid::*load-binary-pathname-types*))")
318 (setq ild-abort-string ":A"
319 ild-continue-string ":C"
320 ild-next-string ":N"
321 ild-next-string-arg ":N %s"
322 ild-previous-string ":P"
323 ild-previous-string-arg ":P %s"
324 ild-top-string ":<"
325 ild-bottom-string ":>"
326 ild-backtrace-string ":B"
327 ild-locals-string ":V"
328 ild-local-string-arg ":L %s"
329 ild-return-string ":R"
330 ild-retry-string ":F"
331 ild-trap-on-exit-string ":X T"))
332 (setq lucid-program "lisp")
333
334 (defdialect allegro "Allegro Common LISP" clisp
335 (ilisp-load-init 'allegro "allegro")
336 (setq comint-fix-error ":pop"
337 ilisp-reset ":reset"
338 comint-continue ":cont"
339 comint-interrupt-regexp "Error: [^\n]* interrupt\)")
340 (setq comint-prompt-status
341 (function (lambda (old line)
342 (comint-prompt-status old line 'allegro-check-prompt))))
343 ;; <cl> or package> at top-level
344 ;; [0-9c] <cl> or package> in error
345 ;; (setq comint-prompt-regexp "^\\(\\[[0-9]*c*\\] \\|\\)\\(<\\|\\)[^>]*> ")
346 (setq comint-prompt-regexp "^\\(\\[[0-9]+i?c?\\] \\|\\[step\\] \\)?\\(<?[-A-Za-z]* ?[0-9]*?>\\|[-A-Za-z0-9]+([0-9]+):\\) ")
347 (setq ilisp-error-regexp
348 "\\(ILISP:[^\"]*\\)\\|\\(Error:[^\n]*\\)\\|\\(Break:[^\n]*\\)")
349
350 (setq ilisp-binary-command "excl:*fasl-default-type*")
351 (setq ilisp-source-types (append ilisp-source-types '(("any"))))
352 (setq ilisp-find-source-command
353 "(ILISP:ilisp-source-files \"%s\" \"%s\" \"%s\")")
354 (setq ilisp-init-binary-command
355 "(let ((ext (or #+m68k \"68fasl\"
356 #+sparc \"sfasl\"
357 #+iris4d \"ifasl\"
358 #+dec3100 \"pfasl\"
359 excl:*fasl-default-type*)))
360 #+allegro-v4.0 (setq ext (concatenate 'string ext \"4\"))
361 ext)")
362 (setq ild-abort-string ":pop"
363 ild-continue-string ":cont"
364 ild-next-string ":dn"
365 ild-next-string-arg ":dn %s"
366 ild-previous-string ":up"
367 ild-previous-string-arg ":up %s"
368 ild-top-string ":to"
369 ild-bottom-string ":bo"
370 ild-backtrace-string ":bt"
371 ild-locals-string ":local"
372 ild-local-string-arg ":local %s"
373 ild-return-string nil ;needs work
374 ild-retry-string ":rest"
375 ild-trap-on-exit-string ":boe"))
376 (setq allegro-program "cl")
377
378 (defdialect akcl "Austin Kyoto Common LISP" kcl
379 (setq comint-prompt-regexp "^[-A-Z]*>+")
380 (setq ild-abort-string ":q"
381 ild-continue-string ":r"
382 ild-next-string ":up"
383 ild-next-string-arg ":up %s"
384 ild-previous-string ":down"
385 ild-previous-string-arg ":down %s"
386 ild-top-string ":down 1000000"
387 ild-bottom-string ":up 1000000"
388 ild-backtrace-string ":bt"
389 ild-locals-string ":fr"
390 ild-local-string-arg ":loc %s"
391 ild-return-string ":r"
392 ild-retry-string nil ;needs work
393 ild-trap-on-exit-string nil)) ;needs work
394 (setq akcl-program "akcl")
395
396 (defdialect cmulisp "CMU Common LISP" clisp
397 (ilisp-load-init 'cmu "cmulisp")
398 (if cmulisp-local-source-directory
399 (setq ilisp-source-directory-fixup-alist
400 (list
401 (cons cmulisp-source-directory-regexp
402 cmulisp-local-source-directory)))
403 (message "cmulisp-local-source-directory not set."))
404 (setq comint-prompt-regexp "^\\([0-9]+\\]+\\|\\*\\) "
405 ilisp-trace-command "(ILISP:cmulisp-trace \"%s\" \"%s\" \"%s\")"
406 comint-prompt-status
407 (function (lambda (old line)
408 (comint-prompt-status old line 'cmulisp-check-prompt)))
409 ilisp-error-regexp "ILISP:[^\"]*\\|Error [^\n]*"
410 ilisp-arglist-command "(ILISP:arglist \"%s\" \"%s\")"
411 ilisp-find-source-command "(ILISP:source-file \"%s\" \"%s\" \"%s\")"
412 comint-fix-error ":pop"
413 comint-continue ":go"
414 ilisp-reset ":q"
415 comint-interrupt-regexp "Interrupted at"
416 ilisp-binary-extension "sparcf")
417 (setq ild-abort-string ":abort"
418 ild-continue-string ":go"
419 ild-next-string ":down"
420 ild-next-string-arg nil ;needs work
421 ild-previous-string ":up"
422 ild-previous-string-arg nil ;needs work
423 ild-top-string ":bottom"
424 ild-bottom-string ":top"
425 ild-backtrace-string ":backtrace"
426 ild-locals-string ":l"
427 ild-local-string-arg "(debug:arg %s)"
428 ild-return-string nil ;needs work (debug:debug-return x)
429 ild-retry-string nil ;needs work
430 ild-trap-on-exit-string nil)) ;needs work
431 (setq cmulisp-program "cmucl")
432
433