home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Garbo
/
Garbo.cdr
/
mac
/
science
/
xlspstr1.sit
/
step.lsp
< prev
next >
Wrap
Lisp/Scheme
|
1990-08-15
|
4KB
|
81 lines
;;;; XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney
;;;; Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz
;;;; You may give out copies of this software; for conditions see the file
;;;; COPYING included with this distribution.
(defun step (expr)
(let ((hooklevel 0)
(option nil)
#+macintosh (dialog (step-dialog))
(help-string "~%:b - break~%:h - help (this message)~%:n - next~%:s - skip~%:e - evaluate~%"))
(labels ((indent () (terpri) (dotimes (i (* 2 hooklevel)) (princ " ")))
(read-option (env)
(loop (princ " ? ")
(let ((c (read)))
(cond
((member c '(:s :n :b)) (return c))
((equal c :h) (format t help-string))
((equal c :e)
(print (evalhook (read)
nil
nil
env)))))))
(trace-hook-function (expr &optional env)
(setq hooklevel (1+ hooklevel))
(indent)
(format t "Form: ~s" expr)
(force-output)
(let ((value (evalhook expr
#'trace-hook-function
nil
env)))
(indent)
(format t "Value: ~s" value)
(force-output)
(setq hooklevel (1- hooklevel))
value))
(step-hook-function (expr &optional env)
(setq hooklevel (1+ hooklevel))
(indent)
(format t "Form: ~s" expr)
(force-output)
(setq option (if (atom expr) nil (read-option env)))
(if (equal option :b) (break))
(let ((value (evalhook expr
(if (equal option :s)
nil ;#'trace-hook-function
#'step-hook-function)
nil
env)))
(indent)
(format t "Value: ~s" value)
(force-output)
(setq hooklevel (1- hooklevel))
value)))
(unwind-protect (step-hook-function expr)
(terpri)
#+macintosh (send dialog :remove)))))
(defun step-dialog ()
(let* ((text-item (send text-item-proto :new " "
:editable t)))
(send dialog-proto :new
(list text-item
(send button-item-proto :new "Eval"
:action
#'(lambda ()
(send *listener* :paste-string
(format nil ":e ~s~%"
(send text-item :text)))))
(send button-item-proto :new "Next"
:action
#'(lambda ()
(send *listener* :paste-string
(format nil ":n~%"))))
(send button-item-proto :new "Skip"
:action
#'(lambda ()
(send *listener* :paste-string
(format nil ":s~%")))))
:type 'modeless)))