Mercurial > hg > xemacs-beta
comparison lisp/ilisp/ilisp-dia.el @ 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 ;;; -*- Mode: Emacs-Lisp -*- | |
2 | |
3 ;;; ilisp-dia.el -- | |
4 | |
5 ;;; This file is part of ILISP. | |
6 ;;; Version: 5.7 | |
7 ;;; | |
8 ;;; Copyright (C) 1990, 1991, 1992, 1993 Chris McConnell | |
9 ;;; 1993, 1994 Ivan Vasquez | |
10 ;;; 1994, 1995 Marco Antoniotti and Rick Busdiecker | |
11 ;;; | |
12 ;;; Other authors' names for which this Copyright notice also holds | |
13 ;;; may appear later in this file. | |
14 ;;; | |
15 ;;; Send mail to 'ilisp-request@lehman.com' to be included in the | |
16 ;;; ILISP mailing list. 'ilisp@lehman.com' is the general ILISP | |
17 ;;; mailing list were bugs and improvements are discussed. | |
18 ;;; | |
19 ;;; ILISP is freely redistributable under the terms found in the file | |
20 ;;; COPYING. | |
21 | |
22 | |
23 ;;;%%CUSTOMIZING DIALECTS | |
24 ;;; | |
25 ;;; ILISP is already set up with support for a number of dialects. | |
26 ;;; Each dialect has a command NAME that will start an inferior LISP | |
27 ;;; of that dialect. NAME-hook is a hook that will run after the | |
28 ;;; default settings for NAME are set up. NAME-program is the default | |
29 ;;; program for NAME. A prefix when starting a dialect will cause you | |
30 ;;; to be prompted for the buffer name and the program. When setting | |
31 ;;; something in a hook, you should use the most general dialect that | |
32 ;;; makes sense. Dialect definitions and their hooks are executed from | |
33 ;;; least specific to most specific. They will be executed before the | |
34 ;;; inferior LISP is started. | |
35 ;;; | |
36 ;;; These are the currently supported dialects. The dialects | |
37 ;;; are listed so that the indentation correponds to the hierarchical | |
38 ;;; relationship between dialects. | |
39 ;;; clisp | |
40 ;;; allegro | |
41 ;;; Clisp (Haible and Stoll) | |
42 ;;; lispworks (Harlequin) | |
43 ;;; lucid | |
44 ;;; cmulisp | |
45 ;;; kcl | |
46 ;;; akcl | |
47 ;;; ibcl | |
48 ;;; ecl | |
49 ;;; gcl | |
50 ;;; scheme | |
51 ;;; oaklisp | |
52 ;;; Scheme->C (still "in fieri") | |
53 ;;; | |
54 ;;; If anyone figures out support for other dialects I would be happy | |
55 ;;; to include it in future releases. | |
56 ;;; | |
57 ;;; ;;; Example of local changes and extensions to ilisp mode | |
58 ;;; (setq ilisp-load-hook | |
59 ;;; '(lambda () | |
60 ;;; ;; Change the allegro lisp program | |
61 ;;; (setq allegro-program "/usr/misc/bin/lisp") | |
62 ;;; ;; Add a new key binding | |
63 ;;; (defkey-ilisp "\C-\M-a" 'arglist-lisp) | |
64 ;;; ;; Define a new subdialect to run on another machine. | |
65 ;;; (defdialect cmlisp "Connection Machine LISP." | |
66 ;;; lucid | |
67 ;;; (setq ilisp-program | |
68 ;;; "rsh power /usr/local/cm/bin/starlisp")))) | |
69 ;;; | |
70 ;;; ;;; Automatically load a new subdialect | |
71 ;;; (autoload 'cmlisp "ilisp" "Run an inferior CM lisp." t) | |
72 ;;; | |
73 ;;; To define a new dialect use the macro defdialect. For examples, | |
74 ;;; look at the dialect definitions in this file. There are hooks and | |
75 ;;; variables for almost anything that you are likely to need to | |
76 ;;; change. The relationship between dialects is hierarchical with | |
77 ;;; the root values being defined in setup-ilisp. For a new dialect, | |
78 ;;; you only need to change the variables that are different than in | |
79 ;;; the parent dialect. | |
80 | |
81 | |
82 ;;; | |
83 ;;; ILISP dialect definition code. | |
84 ;;; | |
85 | |
86 ;;;%Dialects | |
87 (defun lisp-add-dialect (dialect) | |
88 "Add DIALECT as a supported ILISP dialect." | |
89 (if (not (lisp-memk dialect ilisp-dialects 'car)) | |
90 (setq ilisp-dialects | |
91 (cons (list dialect) ilisp-dialects)))) | |
92 | |
93 ;;; | |
94 (defun ilisp-start-dialect (buffer program setup) | |
95 ;; Allow dialects to be started from command line | |
96 (if (eq current-prefix-arg 0) (setq current-prefix-arg nil)) | |
97 (setq ilisp-last-buffer (current-buffer) | |
98 buffer (if current-prefix-arg | |
99 (read-from-minibuffer "Buffer: " buffer) | |
100 buffer)) | |
101 (funcall setup buffer) | |
102 (setq ilisp-program | |
103 (or program | |
104 (if current-prefix-arg | |
105 (lisp-read-program "Program: " ilisp-program) | |
106 ilisp-program))) | |
107 (ilisp buffer setup)) | |
108 | |
109 ;;; | |
110 (defmacro defdialect (dialect full-name parent &rest body) | |
111 "Define a new ILISP dialect. DIALECT is the name of the function to | |
112 invoke the inferior LISP. The hook for that LISP will be called | |
113 DIALECT-hook. The default program will be DIALECT-program. FULL-NAME | |
114 is a string that describes the inferior LISP. PARENT is the name of | |
115 the parent dialect." | |
116 (let ((setup (read (format "setup-%s" dialect))) | |
117 (hook (read (format "%s-hook" dialect))) | |
118 (program (read (format "%s-program" dialect))) | |
119 (dialects (format "%s" dialect))) | |
120 (` | |
121 (progn | |
122 (defvar (, hook) nil (, (format "*Inferior %s hook." full-name))) | |
123 (defvar (, program) nil | |
124 (, (format "*Inferior %s default program." full-name))) | |
125 (defun (, setup) (buffer) | |
126 (, (format "Set up for interacting with %s." full-name)) | |
127 (, (read (format "(setup-%s buffer)" parent))) | |
128 (,@ body) | |
129 (setq ilisp-program (or (, program) ilisp-program) | |
130 ilisp-dialect (cons '(, dialect) ilisp-dialect)) | |
131 (run-hooks '(, (read (format "%s-hook" dialect))))) | |
132 (defun (, dialect) (&optional buffer program) | |
133 (, (format "Create an inferior %s. With prefix, prompt for buffer and program." | |
134 full-name)) | |
135 (interactive (list nil nil)) | |
136 (ilisp-start-dialect (or buffer (, dialects)) | |
137 program | |
138 '(, setup)) | |
139 (setq (, program) ilisp-program)) | |
140 (lisp-add-dialect (, dialects)))))) | |
141 | |
142 ;;;%%ilisp | |
143 (defun setup-ilisp (buffer) | |
144 "Set up for interacting with an inferior LISP." | |
145 (set-buffer (get-buffer-create "*ilisp-send*")) | |
146 (kill-all-local-variables) | |
147 (lisp-mode) | |
148 (setq ilisp-buffer (format "*%s*" buffer)) | |
149 (set-buffer (get-buffer-create ilisp-buffer)) | |
150 (setq major-mode 'ilisp-mode | |
151 mode-name "ILISP") | |
152 (lisp-mode-variables t) | |
153 ;; Set variables to nil | |
154 (let ((binary ilisp-binary-extension) | |
155 (init ilisp-init-binary-extension) | |
156 (vars ilisp-locals)) | |
157 (while (not (null vars)) | |
158 (make-local-variable (car vars)) | |
159 (set (car vars) nil) | |
160 (setq vars (cdr vars))) | |
161 ;; Preserve from initialization | |
162 (if binary (setq ilisp-binary-extension binary)) | |
163 (if init (setq ilisp-init-binary-extension init))) | |
164 ;; Comint defaults | |
165 (set-ilisp-input-ring-size 200) | |
166 (setq comint-prompt-regexp "^[^<> ]*>+:? *" | |
167 | |
168 comint-get-old-input 'ilisp-get-old-input | |
169 comint-input-sentinel (function ignore) | |
170 comint-input-filter 'ilisp-input-filter | |
171 comint-input-sender 'comint-default-send | |
172 comint-eol-on-send t) | |
173 ;; Comint-ipc defaults | |
174 (setq comint-send-newline t | |
175 comint-always-scroll nil | |
176 comint-output-buffer " *Output*" | |
177 comint-error-buffer " *Error Output*" | |
178 comint-error-regexp "^\"ILISP:" | |
179 comint-output-filter (function identity) | |
180 comint-interrupt-start 'comint-interrupt-start | |
181 comint-handler 'ilisp-handler | |
182 comint-update-status 'ilisp-update-status | |
183 comint-prompt-status 'comint-prompt-status | |
184 comint-abort-hook 'ilisp-abort-handler) | |
185 (setq ilisp-use-map ilisp-mode-map | |
186 ilisp-init-hook '((lambda () (ilisp-init nil nil t))) | |
187 ilisp-filter-regexp "\\`\\s *\\(:\\(\\w\\|\\s_\\)*\\)?\\s *\\'" | |
188 ilisp-filter-length 3 | |
189 ilisp-error-filter 'ilisp-error-filter | |
190 ilisp-error-regexp ".*" | |
191 ilisp-symbol-delimiters "^ \t\n\('\"#.\)<>" | |
192 ilisp-program "lisp" | |
193 ilisp-locator 'lisp-locate-ilisp | |
194 ilisp-calls-locator 'lisp-locate-calls) | |
195 (run-hooks 'ilisp-mode-hook)) | |
196 | |
197 (defun run-ilisp () | |
198 "Create an inferior LISP prompting for dialect. With prefix, prompt | |
199 for buffer name as well." | |
200 (interactive) | |
201 (let ((dialect (completing-read "Dialect: " ilisp-dialects nil t))) | |
202 (if (not (zerop (length dialect))) | |
203 (call-interactively (read dialect))))) | |
204 |