Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/ilisp/ilisp-dia.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,204 @@ +;;; -*- Mode: Emacs-Lisp -*- + +;;; ilisp-dia.el -- + +;;; This file is part of ILISP. +;;; Version: 5.7 +;;; +;;; Copyright (C) 1990, 1991, 1992, 1993 Chris McConnell +;;; 1993, 1994 Ivan Vasquez +;;; 1994, 1995 Marco Antoniotti and Rick Busdiecker +;;; +;;; Other authors' names for which this Copyright notice also holds +;;; may appear later in this file. +;;; +;;; Send mail to 'ilisp-request@lehman.com' to be included in the +;;; ILISP mailing list. 'ilisp@lehman.com' is the general ILISP +;;; mailing list were bugs and improvements are discussed. +;;; +;;; ILISP is freely redistributable under the terms found in the file +;;; COPYING. + + +;;;%%CUSTOMIZING DIALECTS +;;; +;;; ILISP is already set up with support for a number of dialects. +;;; Each dialect has a command NAME that will start an inferior LISP +;;; of that dialect. NAME-hook is a hook that will run after the +;;; default settings for NAME are set up. NAME-program is the default +;;; program for NAME. A prefix when starting a dialect will cause you +;;; to be prompted for the buffer name and the program. When setting +;;; something in a hook, you should use the most general dialect that +;;; makes sense. Dialect definitions and their hooks are executed from +;;; least specific to most specific. They will be executed before the +;;; inferior LISP is started. +;;; +;;; These are the currently supported dialects. The dialects +;;; are listed so that the indentation correponds to the hierarchical +;;; relationship between dialects. +;;; clisp +;;; allegro +;;; Clisp (Haible and Stoll) +;;; lispworks (Harlequin) +;;; lucid +;;; cmulisp +;;; kcl +;;; akcl +;;; ibcl +;;; ecl +;;; gcl +;;; scheme +;;; oaklisp +;;; Scheme->C (still "in fieri") +;;; +;;; If anyone figures out support for other dialects I would be happy +;;; to include it in future releases. +;;; +;;; ;;; Example of local changes and extensions to ilisp mode +;;; (setq ilisp-load-hook +;;; '(lambda () +;;; ;; Change the allegro lisp program +;;; (setq allegro-program "/usr/misc/bin/lisp") +;;; ;; Add a new key binding +;;; (defkey-ilisp "\C-\M-a" 'arglist-lisp) +;;; ;; Define a new subdialect to run on another machine. +;;; (defdialect cmlisp "Connection Machine LISP." +;;; lucid +;;; (setq ilisp-program +;;; "rsh power /usr/local/cm/bin/starlisp")))) +;;; +;;; ;;; Automatically load a new subdialect +;;; (autoload 'cmlisp "ilisp" "Run an inferior CM lisp." t) +;;; +;;; To define a new dialect use the macro defdialect. For examples, +;;; look at the dialect definitions in this file. There are hooks and +;;; variables for almost anything that you are likely to need to +;;; change. The relationship between dialects is hierarchical with +;;; the root values being defined in setup-ilisp. For a new dialect, +;;; you only need to change the variables that are different than in +;;; the parent dialect. + + +;;; +;;; ILISP dialect definition code. +;;; + +;;;%Dialects +(defun lisp-add-dialect (dialect) + "Add DIALECT as a supported ILISP dialect." + (if (not (lisp-memk dialect ilisp-dialects 'car)) + (setq ilisp-dialects + (cons (list dialect) ilisp-dialects)))) + +;;; +(defun ilisp-start-dialect (buffer program setup) + ;; Allow dialects to be started from command line + (if (eq current-prefix-arg 0) (setq current-prefix-arg nil)) + (setq ilisp-last-buffer (current-buffer) + buffer (if current-prefix-arg + (read-from-minibuffer "Buffer: " buffer) + buffer)) + (funcall setup buffer) + (setq ilisp-program + (or program + (if current-prefix-arg + (lisp-read-program "Program: " ilisp-program) + ilisp-program))) + (ilisp buffer setup)) + +;;; +(defmacro defdialect (dialect full-name parent &rest body) + "Define a new ILISP dialect. DIALECT is the name of the function to +invoke the inferior LISP. The hook for that LISP will be called +DIALECT-hook. The default program will be DIALECT-program. FULL-NAME +is a string that describes the inferior LISP. PARENT is the name of +the parent dialect." + (let ((setup (read (format "setup-%s" dialect))) + (hook (read (format "%s-hook" dialect))) + (program (read (format "%s-program" dialect))) + (dialects (format "%s" dialect))) + (` + (progn + (defvar (, hook) nil (, (format "*Inferior %s hook." full-name))) + (defvar (, program) nil + (, (format "*Inferior %s default program." full-name))) + (defun (, setup) (buffer) + (, (format "Set up for interacting with %s." full-name)) + (, (read (format "(setup-%s buffer)" parent))) + (,@ body) + (setq ilisp-program (or (, program) ilisp-program) + ilisp-dialect (cons '(, dialect) ilisp-dialect)) + (run-hooks '(, (read (format "%s-hook" dialect))))) + (defun (, dialect) (&optional buffer program) + (, (format "Create an inferior %s. With prefix, prompt for buffer and program." + full-name)) + (interactive (list nil nil)) + (ilisp-start-dialect (or buffer (, dialects)) + program + '(, setup)) + (setq (, program) ilisp-program)) + (lisp-add-dialect (, dialects)))))) + +;;;%%ilisp +(defun setup-ilisp (buffer) + "Set up for interacting with an inferior LISP." + (set-buffer (get-buffer-create "*ilisp-send*")) + (kill-all-local-variables) + (lisp-mode) + (setq ilisp-buffer (format "*%s*" buffer)) + (set-buffer (get-buffer-create ilisp-buffer)) + (setq major-mode 'ilisp-mode + mode-name "ILISP") + (lisp-mode-variables t) + ;; Set variables to nil + (let ((binary ilisp-binary-extension) + (init ilisp-init-binary-extension) + (vars ilisp-locals)) + (while (not (null vars)) + (make-local-variable (car vars)) + (set (car vars) nil) + (setq vars (cdr vars))) + ;; Preserve from initialization + (if binary (setq ilisp-binary-extension binary)) + (if init (setq ilisp-init-binary-extension init))) + ;; Comint defaults + (set-ilisp-input-ring-size 200) + (setq comint-prompt-regexp "^[^<> ]*>+:? *" + + comint-get-old-input 'ilisp-get-old-input + comint-input-sentinel (function ignore) + comint-input-filter 'ilisp-input-filter + comint-input-sender 'comint-default-send + comint-eol-on-send t) + ;; Comint-ipc defaults + (setq comint-send-newline t + comint-always-scroll nil + comint-output-buffer " *Output*" + comint-error-buffer " *Error Output*" + comint-error-regexp "^\"ILISP:" + comint-output-filter (function identity) + comint-interrupt-start 'comint-interrupt-start + comint-handler 'ilisp-handler + comint-update-status 'ilisp-update-status + comint-prompt-status 'comint-prompt-status + comint-abort-hook 'ilisp-abort-handler) + (setq ilisp-use-map ilisp-mode-map + ilisp-init-hook '((lambda () (ilisp-init nil nil t))) + ilisp-filter-regexp "\\`\\s *\\(:\\(\\w\\|\\s_\\)*\\)?\\s *\\'" + ilisp-filter-length 3 + ilisp-error-filter 'ilisp-error-filter + ilisp-error-regexp ".*" + ilisp-symbol-delimiters "^ \t\n\('\"#.\)<>" + ilisp-program "lisp" + ilisp-locator 'lisp-locate-ilisp + ilisp-calls-locator 'lisp-locate-calls) + (run-hooks 'ilisp-mode-hook)) + +(defun run-ilisp () + "Create an inferior LISP prompting for dialect. With prefix, prompt +for buffer name as well." + (interactive) + (let ((dialect (completing-read "Dialect: " ilisp-dialects nil t))) + (if (not (zerop (length dialect))) + (call-interactively (read dialect))))) +