home *** CD-ROM | disk | FTP | other *** search
- ;;; (C) Copyright 1984 by Gold Hill Computers
-
- ;;; GOLDEN COMMON LISP initialization file
-
- (SETQ *BQ-LEVEL* 0
- *BQ-COMMA* (GENSYM)
- *BQ-COMMA-AT* (GENSYM))
-
- ;; the famous back-quote macro
- (DEFUN BQ (X &AUX)
- (COND ((NULL X) NIL)
- ((ATOM X) (LIST 'QUOTE X))
- ((EQ (CAR X) *BQ-COMMA*)
- (CADR X))
- (T
- (DO* ((HOOK (NCONS 'LIST))
- (Y HOOK (SNOC Y (BQ (CAR X))))
- (X X (CDR X)))
- ((NULL X) HOOK)
- (COND ((ATOM X)
- (RPLACA HOOK 'LIST*)
- (SNOC Y (LIST 'QUOTE X))
- (RETURN HOOK))
- ((EQ (CAR X) *BQ-COMMA-AT*)
- (RPLACA HOOK 'LIST*)
- (RPLACD Y (NCONS (LIST 'APPEND
- (CADR X)
- (BQ (CDDR X)))))
- (RETURN HOOK))
- ((EQ (CAR X) *BQ-COMMA*)
- (RPLACA HOOK 'LIST*)
- (RPLACD Y (NCONS (CADR X)))
- (RETURN HOOK)))))))
-
- (DEFUN COMMA-MACRO (STREAM IGNORE &AUX X)
- (WHEN (<= *BQ-LEVEL* 0)
- (ERROR "Comma not inside backquote"))
- (IF (OR (EQ (SETQ X (FUNCALL STREAM :READ-CHAR)) 64.) ; is it "@"?
- (EQ X 46)) ; or a "."?
- *BQ-COMMA-AT*
- (PROGN
- (FUNCALL STREAM :UNREAD-CHAR X) ; put it back
- (LIST *BQ-COMMA* (READ STREAM NIL NIL T)))))
-
- (DEFUN BQ-MACRO (STREAM IGNORE &AUX (*BQ-LEVEL* (1+ *BQ-LEVEL*)))
- (BQ (READ STREAM NIL NIL T)))
-
- (SET-MACRO-CHARACTER 44. 'COMMA-MACRO)
- (SET-MACRO-CHARACTER 96. 'BQ-MACRO)
-
- (MACRO DEFMACRO (FRM)
- (IF (NOT (SYMBOLP (NTH 2 FRM)))
- (PROGN
- (AUTOLOAD DEFMACRO "DEFMAC.LSP" *LISP-LIBRARY-PATHNAME*
- *LISP-LIBRARY-DISKETTE*)
- FRM) ; do it again
- `(MACRO ,(NTH 1. FRM) (,(NTH 2. FRM)) ; Name and arglist
- (RPLACB ,(NTH 2. FRM) ; macro's arg
- (PROGN
- ;; pop off first element of arg list
- (SETQ ,(NTH 2. FRM) (CDR ,(NTH 2. FRM)))
- ,@(NTHCDR 3. FRM)))))) ; splice in body
-
- ;; A simple DEFVAR macro
- (DEFMACRO DEFVAR FRM
- `(UNLESS (BOUNDP ',(CAR FRM))
- (SETQ ,(CAR FRM) ,(IF (> (LENGTH FRM) 1.)
- (CADR FRM)
- NIL))))
-
- ;; A simple DEFCONSTANT
- (DEFMACRO DEFCONSTANT FRM
- `(SETQ ,(CAR FRM) ,(CADR FRM)))
-
- ;; A simple DEFPARAMETER
- (DEFMACRO DEFPARAMETER FRM
- `(SETQ ,(CAR FRM) ,(CADR FRM)))
-
- ;; The Sharp sign macro character handlers.
- (DEFCONSTANT *SHARP-SIGN-MACROS*
- '(
- (39. . ;#'
- (LAMBDA (S)
- (LIST 'FUNCTION (READ S NIL NIL T))))
- (40. . ;#(
- (LAMBDA (S &AUX X)
- (FUNCALL S :UNREAD-CHAR 40.)
- (SETQ X (READ S NIL NIL T))
- (APPLY 'VECTOR X)))
- (43. . ; #+
- (LAMBDA (S &AUX (X (READ S NIL NIL T)))
- (VALUES (READ S NIL NIL T) (NOT (|#-FEATUREP| X)))))
- (45. . ; #-
- (LAMBDA (S &AUX (X (READ S NIL NIL T)))
- (VALUES (READ S NIL NIL T) (|#-FEATUREP| X))))
- (46. . ; #.
- (LAMBDA (S)
- (EVAL (READ S NIL NIL T))))
- (58. . ;#:
- (LAMBDA (S) (COPY-SYMBOL (READ S NIL NIL T))))
- (66. . ;#B
- (LAMBDA (S &AUX (*READ-BASE* 2.))
- (READ S NIL NIL T)))
- (68. . ;#D
- (LAMBDA (S &AUX (*READ-BASE* 10.))
- (READ S NIL NIL T)))
- (79. . ;#O
- (LAMBDA (S &AUX (*READ-BASE* 8.))
- (READ S NIL NIL T)))
- (83. . ;#S
- (LAMBDA (S &AUX (SPEC (READ S NIL NIL T)))
- (EVAL (CONS (INTERN (STRING-APPEND "MAKE-" (CAR SPEC)))
- (DO ((X (CDR SPEC) (CDDR X))
- (RESULT NIL (CONS `',(CADR X)
- (CONS (%INTERN (CAR X) 'KEYWORD)
- RESULT))))
- ((NULL X) (NREVERSE RESULT)))))))
- (88. . ;#X
- (LAMBDA (S &AUX (*READ-BASE* 16.))
- (READ S NIL NIL T)))
- (92. . ; #\
- (LAMBDA (S)
- (FUNCALL S :UNREAD-CHAR 92.) ; put escape char back
- (DO ((STR (STRING (READ S NIL NIL T)))
- (BITS 0)
- (I 0))
- (())
- (COND ((= (- (LENGTH STR) I) 1) ; 1 char left
- (RETURN (CODE-CHAR (CHAR STR I) BITS)))
- ((STRING-EQUAL "C-" STR :START2 I :END2 (+ I 2))
- (SETQ BITS (LOGIOR BITS 1)
- I (+ I 2)))
- ((STRING-EQUAL "M-" STR :START2 I :END2 (+ I 2))
- (SETQ BITS (LOGIOR BITS 2)
- I (+ I 2)))
- ((NAME-CHAR (SETQ STR (SUBSEQ STR I)))
- (RETURN (CODE-CHAR (NAME-CHAR STR) BITS)))
- (T
- (ERROR "Bad \"\#\\\" name: ~S" STR))))))
- (124. . ;#|
- (LAMBDA (S)
- (DO ((CNT 0)
- (CHAR (FUNCALL S :READ-CHAR) (FUNCALL S :READ-CHAR))
- (LCHAR 0 CHAR))
- ((AND (= CHAR 35.)(= LCHAR 124.)(ZEROP CNT)) NIL)
- (COND ((AND (= LCHAR 35.)(= CHAR 124.))
- (INCF CNT))
- ((AND (= LCHAR 124.)(= CHAR 35.)(> CNT 0))
- (DECF CNT))))))
- ))
-
- ;; Used by the #+ and #- macros
- (DEFUN |#-FEATUREP| (F)
- (COND ((ATOM F)(MEMBER F *FEATURES*))
- ((EQ (CAR F) 'NOT) (NOT (|#-FEATUREP| (SECOND F))))
- ((EQ (CAR F) 'OR)
- (DOLIST (I (REST F) NIL)
- (WHEN (|#-FEATUREP| I) (RETURN T))))
- ((EQ (CAR F) 'AND)
- (DOLIST (I (REST F) T)
- (UNLESS (|#-FEATUREP| I) (RETURN NIL))))
- (T (ERROR "Bad #+/- feature syntax: ~S" F))))
-
- (DEFUN SHARP-MACRO (STREAM IGNORE &AUX X Y)
- (SETQ X
- (ASSOC (CHAR-UPCASE (SETQ Y (FUNCALL STREAM :READ-CHAR)))
- *SHARP-SIGN-MACROS*))
- (IF X
- (FUNCALL (CDR X) STREAM)
- (ERROR NIL "Undefined \# macro: ~C" Y)))
-
- (SET-MACRO-CHARACTER 35. 'SHARP-MACRO)
-
- ;;; an autoload facility
- (DEFMACRO AUTOLOAD ARGS
- (LET ((NAME (FIRST ARGS))
- (FILENAME (SECOND ARGS))
- (DEV-DIR (OR (THIRD ARGS) '*LISP-LIBRARY-PATHNAME*))
- (DISKETTE (NTH 3 ARGS)))
- `(MACRO ,NAME (FORM)
- (AUTOLOAD1 FORM ',NAME ,FILENAME ,DEV-DIR ,DISKETTE))))
-
- (DEFUN AUTOLOAD1 (FORM NAME FILENAME DEV-DIR DISKETTE)
- (WHEN *LOAD-VERBOSE*
- (FORMAT T "~&; Autoloading definition of ~A." NAME))
- (WITH-DISKETTE DISKETTE
- #'LOAD
- (MERGE-PATHNAMES
- (MERGE-PATHNAMES FILENAME ".LSP")
- DEV-DIR)
- :VERBOSE NIL)
- FORM)
-
- (DEFVAR *EXPLORER-LOADED-P* NIL)
- (DEFVAR *GMACS-LOADED-P* NIL)
-
- (DEFMACRO INSPECT X
- `(INSPECT-EXPLORE 'I-INSPECT ',X))
-
- (DEFMACRO EXPLORE X
- `(INSPECT-EXPLORE 'I-EXPLORE ',X))
-
- (DEFUN INSPECT-EXPLORE (FUNC ARG-LIST &AUX *LOAD-VERBOSE*)
- (WHEN *GMACS-LOADED-P*
- (ERROR "The EXPLORER cannot be loaded after GMACS has been loaded.
- Exit GCLISP by typing (EXIT) and re-start GCLISP."))
- (IF (NULL *EXPLORER-LOADED-P*)
- (PROGN
- (FORMAT T "~%Loading San Marco LISP Explorer.")
- (SETF *EXPLORER-LOADED-P* T)
- (EVAL `(,FUNC ',ARG-LIST :DIRECTIVE :LOAD)))
- (FUNCALL FUNC ARG-LIST :DIRECTIVE :RUN)))
-
- (DEFUN ED (&REST X &AUX *LOAD-VERBOSE*)
- (WHEN *EXPLORER-LOADED-P*
- (ERROR "GMACS cannot be loaded after The EXPLORER has been loaded.
- Exit GCLISP by typing (EXIT) and re-start GCLISP."))
- (IF (NULL *GMACS-LOADED-P*)
- (PROGN
- (SETF *GMACS-LOADED-P* T)
- (I-ED X :DIRECTIVE :LOAD))
- (I-ED X :DIRECTIVE :RUN)))
-
- (AUTOLOAD I-EXPLORE "EXPLORE.LSP" *EXPLORER-VIEWER-PATHNAME*
- *EXPLORER-VIEWER-DISKETTE*)
- (AUTOLOAD I-INSPECT "EXPLORE.LSP" *EXPLORER-VIEWER-PATHNAME*
- *EXPLORER-VIEWER-DISKETTE*)
- (AUTOLOAD I-ED "GMACS" *GMACS-PATHNAME* *GMACS-DISKETTE*)
- (AUTOLOAD APROPOS "APROPOS" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD LAMBDA-LIST "DOC" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD DEFSTRUCT "DEFSTRUC" *LISP-LIBRARY-PATHNAME*
- *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD DESCRIBE "DESCRIBE" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD DOC "DOC" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD DOCUMENTATION "DOC" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD DRIBBLE "DRIBBLE" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD MAKE-WINDOW-STREAM "WSTREAM" *LISP-LIBRARY-PATHNAME*
- *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD PIANO "MUSICPGM" *EXAMPLE-PATHNAME* *EXAMPLE-DISKETTE*)
- (AUTOLOAD PPRINT "PPRINT" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD ROOM "UTIL" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD STEP "STEPPER" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD TIME "UTIL" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD TRACE "TRACE" *LISP-LIBRARY-PATHNAME* *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD WITH-OPEN-STREAM "MACRO" *LISP-LIBRARY-PATHNAME*
- *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD WITH-OPEN-FILE "MACRO" *LISP-LIBRARY-PATHNAME*
- *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD WITH-OUTPUT-TO-STRING "MACRO" *LISP-LIBRARY-PATHNAME*
- *LISP-LIBRARY-DISKETTE*)
- (AUTOLOAD CHECK-FILES "CHECK" *INTERPRETER-PATHNAME*
- *INTERPRETER-DISKETTE*)
- (AUTOLOAD CONFIGURE-GCLISP "CONFIGGC" *INTERPRETER-PATHNAME*
- *INTERPRETER-DISKETTE*)
-
- ;;; Where the docfile lives (directory comes from *DOCUMENT-PATHNAME*).
- (DEFVAR *DOC-FILE-PATHNAME* "DOCFILE.BIN")
-
- ;;; Its rather important that this is HERE, not autoloaded.
- ;;; For closing all currently open files.
- (DEFUN CLOSE-ALL-FILES ()
- (MAPCAR '(LAMBDA (FILE-STREAM)
- (PROG1 (FILE-STREAM :PATHNAME)
- (FILE-STREAM :CLOSE :ABORT)))
- *OPEN-FILE-STREAMS*))
-
- ;;; The GCLISP input-editor facility. The input-editor is used when
- ;;; functions like READ and READ-LINE read from the keyboard (ie, a
- ;;; WINDOW-STREAM.
- (SETQ *DEFAULT-IE-OPTIONS*
- '((IE-COMMANDS (#\M-A . IE-APROPOS) ; <alt>-A - apropos
- (#\M-L . IE-LAMBDA-LIST) ; <alt>-L lambda-list
- (#\M-E . (LAMBDA (&REST IGNORE)
- (EXPLORE)
- (stack-group-unwind)
- :REFRESH))
- (#\C-B . (LAMBDA (&REST IGNORE) ; ^B - backtrace
- (TERPRI T)
- (BACKTRACE)
- (TERPRI T)
- :REFRESH))
- (#\C-D . (LAMBDA (&REST IGNORE &AUX TEMP) ; ^D - DOS
- (FORMAT T "~&Going to DOS, type EXIT to return to GCLISP.")
- (WHEN (SETQ TEMP (DOS))
- (FORMAT T "~&Failed: ~?"
- (CASE TEMP
- (2
- "COMMAND.COM not found, Please insert DOS system diskette in your
- BOOT diskette drive. Remember to insert GCLISP diskette when you
- return to GCLISP.")
- (4 "Probably too many files open, try (CLOSE-ALL-FILES)")
- (8
- "Insufficient memory. You must reserve at least 28k bytes for DOS access.")
- (OTHERWISE "DOS error code ~D"))
- (LIST TEMP)))
- :REFRESH))
- (#\M-H . (LAMBDA (&REST IGNORE)
- (FUNCALL *IE-HELP*)))
- (#\M-D . IE-DOC) ; <alt>-D - DOC
- (#\M-K . IE-KEYS)
- (#\C-E . IE-EDIT)
- (#\C-G . (LAMBDA (&REST IGNORE) ; ^G - CLEAN-UP-ERROR
- (CLEAN-UP-ERROR)))
- (#\C-L . (LAMBDA (&REST IGNORE) ; ^L - CLEAR SCREEN
- (SEND *TERMINAL-IO* :CLEAR-SCREEN)
- (PRINC *LISTENER-NAME* T)
- :REFRESH))
- (#\C-P . (LAMBDA (&REST IGNORE) ; ^P - CONTINUE
- (FORMAT *DEBUG-IO* "[continuing]~%")
- (CONTINUE)))
- (#\C-C . CTRL-C-HANDLER)
- (#\ESC . (LAMBDA (BUF IGNORE) ; <esc> delete chars
- (LENGTH BUF)))
- (#\RUBOUT . (LAMBDA (IGNORE IGNORE) ; <RUBOUT> 1 CHAR
- 1))
- )))
-
- (DEFUN CTRL-C-HANDLER (&REST IGNORE)
- (STACK-GROUP-UNWIND))
-
- (DEFVAR *IE-HELP* 'IE-HELP)
- (DEFVAR *HELP-WAIT-TIME* 100)
-
- (DEFUN IE-EXPLORE (&rest ignore)
- (EXPLORE))
-
- (DEFUN IE-KEYS (&REST IGNORE)
- (send *terminal-io* :clear-screen)
- (FORMAT T "~&
- ══════════════════════════════════════════════════════════════════════════════
- These are the GCLISP keychord commands:
-
- Alt-A Apropos a string
- Alt-D Document a function, variable, or type
- Alt-E Enter the LISP Explorer
- Alt-H Invoke On-line Help
- Alt-K Display this list of keychord commands
- Alt-L Display the lambda-list of a function
- Ctrl-B Backtrace the execution stack
- Ctrl-C Unwind to Top-Level
- Ctrl-D Invoke the DOS command processor
- Ctrl-E Invoke the GMACS editor
- Ctrl-G Go up one error level
- Ctrl-L Clear the display screen
- Ctrl-P Continue from a break
- Ctrl-Break Enter into a break level
- Ctrl-NumLock Halt typeout to screen (any key continues)
- Rubout Delete the preceding character
- Esc Delete the current input line
-
- These keychords can be typed at any time.
- ══════════════════════════════════════════════════════════════════════════════
- "
- )
- :REFRESH)
-
- (DEFUN IE-HELP (&REST INGNORE &AUX CHAR)
- (send *terminal-io* :clear-screen)
- (format t "~&══════════════════════════════════════════════════════════════════════════════
- To invoke one of the following GCLISP applications,
- type the indicated keychord:
-
- Alt-E The LISP Explorer, an on-line tutorial
- Ctrl-E The GMACS Editor
-
- To get help in one of the following areas,
- type the indicated keychord:
-
- Alt-K \"Keys\" - Displays a list of the actions
- invoked by special keys and keychords.
-
- Alt-A \"Apropos\" - Lists all symbols whose names
- contain a specified string. Prompts for the string.
-
- Alt-D \"Documentation\" - Displays the on-line documentation
- for a specified function, variable, or type name.
- Prompts for the name.
-
- Alt-L \"Lambda-List\" - Displays the arguments for a specified
- function. Prompts for the function name.
-
- ══════════════════════════════════════════════════════════════════════════════"
- )
- :REFRESH)
-
- (DEFUN IE-EDIT (&REST IGNORE)
- (ED) :REFRESH)
-
- (DEFUN IE-LAMBDA-LIST (&OPTIONAL BUF IGNORE)
- (LET ((F (AND BUF (FIND-FUNC BUF))))
- (LABELS ((AL (F)
- (MULTIPLE-VALUE-BIND (L NOT-FOUND-P)(LAMBDA-LIST F)
- (IF NOT-FOUND-P
- (FORMAT T "~&No lambda list found for ~S" F)
- (FORMAT T "~&Lambda list for ~S: ~A~%" F L)))))
- (IF F
- (AL F)
- (PROGN
- (FORMAT T "~&Lambda list for which function: ")
- (AL (READ T))))))
- :REFRESH)
-
-
- (DEFUN IE-APROPOS (&REST IGNORE)
- (FORMAT T "~&Apropos string: ")
- (LET ((STR (READ T)))
- (APROPOS STR))
- :REFRESH)
-
- (DEFUN FIND-FUNC (BUF)
- (LET ((IDX (1- (LENGTH BUF))))
- (WHEN (PLUSP IDX)
- (DOTIMES (I (LENGTH BUF))
- (IF (EQ #\( (CHAR BUF IDX)) (RETURN NIL))
- (DECF IDX))
- (MULTIPLE-VALUE-BIND (VAL ERROR-P)
- (IGNORE-ERRORS (READ-FROM-STRING BUF NIL NIL :START (1+ IDX)))
- (IF ERROR-P NIL VAL)))))
-
- (DEFUN IE-DOC (&OPTIONAL BUF IGNORE)
- (LET ((F (AND BUF (FIND-FUNC BUF))))
- (IF F
- (DOC F)
- (PROGN
- (FORMAT T "~&Documentation for which function: ")
- (SETQ F (READ T))
- (DOC F))))
- :REFRESH)
-
- (SETF HELP "Type Alt-H for help" ; For friendliness.
- ? HELP)
-
- (LET ((PN (MERGE-PATHNAMES "USERINIT.LSP")))
- (WHEN (PROBE-FILE PN)
- (LOAD PN)))
-
- (DEFVAR *INITIAL-MEMORY-ALLOCATED-P*
- (PROGN
- (ALLOCATE *PARAGRAPHS-RESERVED-FOR-DOS*
- *INITIAL-CONS-WEIGHT*
- *INITIAL-ATOM-WEIGHT*
- T)
- T))
-
- (SETQ *GC-LIGHT-P* 112)
-
- (WHEN *GCLISP-UNCONFIGURED-P*
- (FORMAT T "~&This GCLISP has not been configured,
- type (CONFIGURE-GCLISP).~&")
- )
-
- (FORMAT T "~&~A" HELP)
-