home *** CD-ROM | disk | FTP | other *** search
- ;; Copyright (C) 1894 by Gold Hill Computers
- ;;
- ;; The GCLisp Stepper
- ;;
-
-
- (DEFVAR *STEP-LEVEL* 0) ; The current step nesting level
- (DEFVAR *STEP-TARGET* 0) ; the next level to step to.
-
- ;; The toplevel stepper
-
- (DEFMACRO STEP X
- `(STEP1 ',(FIRST X)))
-
- (DEFUN STEP1 (STEP-FORM)
- (LET ((*STEP-LEVEL* 1)
- (*STEP-TARGET* 1)
- (*BREAK-EVENT* 'STEP-BREAK)
- STEP-VALUE STEP-VALUES)
- (SEND *TRACE-OUTPUT* :CLEAR-INPUT)
- (STEP-INTERNAL STEP-FORM)))
-
- ;; The internal stepper function
- ;;
- (DEFUN STEP-INTERNAL (STEP-FORM
- &REST ENV)
- (WHEN ENV (SETF STEP-VALUES ENV
- STEP-VALUE (FIRST ENV)))
- (STEP-INTERNAL-COMMAND))
-
- (DEFUN STEP-INTERNAL-COMMAND ()
- (COND
- ((< *STEP-TARGET* 0)
- (SETF STEP-VALUE
- (FIRST (SETF STEP-VALUES
- (MULTIPLE-VALUE-LIST (EVAL STEP-FORM))))))
- ((NEQ *STEP-TARGET* *STEP-LEVEL*)
- (DECF *STEP-LEVEL*) ; unwind it.
- (SETF STEP-VALUE
- (FIRST (SETF STEP-VALUES
- (MULTIPLE-VALUE-LIST (EVAL STEP-FORM))))))
- (T
- (SEND *TRACE-OUTPUT* :FRESH-LINE) ; clear the output
- (STEP-INDENT)
- (FORMAT *TRACE-OUTPUT* "~S" STEP-FORM) ; print the input form
- (CASE (STEPPER-COMMAND) ; now dispatch on it.
- (26 ; move across it.
- (SETF STEP-VALUE (FIRST (SETF STEP-VALUES
- (MULTIPLE-VALUE-LIST
- (EVAL STEP-FORM)))))
- (IF (EQ 1 (LENGTH STEP-VALUES))
- (FORMAT *TRACE-OUTPUT* " --> ~S~&" STEP-VALUE)
- (FORMAT *TRACE-OUTPUT* " --> ~S~&" STEP-VALUES)))
-
- (25 ; next level down
- (INCF *STEP-LEVEL*)
- (INCF *STEP-TARGET*)
- (SETF STEP-VALUE
- (FIRST (SETF STEP-VALUES
- (MULTIPLE-VALUE-LIST
- (EVALHOOK STEP-FORM 'STEP-INTERNAL NIL)))))
- (SEND *TRACE-OUTPUT* :FRESH-LINE) ; and print exit things
- (STEP-INDENT)
- (WHEN (EQ *STEP-LEVEL* *STEP-TARGET*)
- (IF (EQ 1 (LENGTH STEP-VALUES))
- (FORMAT *TRACE-OUTPUT* "~S = ~S" STEP-FORM STEP-VALUE)
- (FORMAT *TRACE-OUTPUT* "~S = ~S" STEP-FORM STEP-VALUES))
- (DECF *STEP-TARGET*))
- (DECF *STEP-LEVEL*))
-
- (24 ; up one level
- (SETF STEP-VALUE ; eval it with
- (FIRST (SETF STEP-VALUES ; no info printed.
- (MULTIPLE-VALUE-LIST (EVAL STEP-FORM)))))
- (DECF *STEP-TARGET*))
-
- (5 ; let it roll without stepping
- (SETF *STEP-TARGET* -1)
- (SETF STEP-VALUE ; eval it with no info printed.
- (FIRST (SETF STEP-VALUES
- (MULTIPLE-VALUE-LIST (EVAL STEP-FORM))))))
-
- ;;
- (11 ; pretty print the thing
- (PPRINT STEP-FORM)
- (SEND *TRACE-OUTPUT* :WRITE-CHAR #\NEWLINE)
- (STEP-INDENT)
- (STEP-INTERNAL-COMMAND))
- (OTHERWISE
- (FORMAT *TRACE-OUTPUT*
- "~&STEP commands are:
- arrow-dn ==> Step to next level down
- arrow-rt ==> Value of this form
- arrow-up ==> Step to next level up
- arrow-lt ==> PrettyPrint current form
- Ctrl-Break ==> Enter Break Level
- END ==> Complete without more Stepping~%")
- (STEP-INDENT)
- (STEP-INTERNAL-COMMAND))
- )
- ; and now return the values
- (APPLY 'VALUES STEP-VALUES))))
-
- (DEFUN STEP-BREAK (&REST IGNORE)
- (BREAK "STEPPER BREAK")
- (SEND *TRACE-OUTPUT* :CLEAR-INPUT)
- (FORMAT *TRACE-OUTPUT* "~&Back to STEP with form:")
- (SEND *TRACE-OUTPUT* :FRESH-LINE) ; clear the output
- (STEP-INDENT)
- (FORMAT *TRACE-OUTPUT* "~S" STEP-FORM) ; print the input form
- )
-
-
-
- (DEFUN STEPPER-COMMAND (&AUX %CHAR)
- (SEND *TRACE-OUTPUT* :CLEAR-INPUT)
- (WHEN (EQ (SETF %CHAR (SEND *TRACE-OUTPUT* :READ-CHAR)) #\SPACE)
- (SETF %CHAR (SEND *TRACE-OUTPUT* :READ-CHAR)))
- %CHAR)
-
-
- (DEFUN STEP-INDENT ()
- (DOTIMES (I *STEP-LEVEL*) (SEND *TRACE-OUTPUT* :WRITE-CHAR #\SPACE)))
-
-
-
-
-