(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "XCL-USER")
(il:filecreated "14-Aug-87 17:09:50" il:{qv}<jellinek>convert>debugger-context.\;2        

      il:|changes| il:|to:|  (il:commands "unlex")
                             (il:functions open-lex-env init-debugger-context lex-eval-input)
                             (il:vars il:debugger-contextcoms)

      il:|previous| il:|date:| "10-Aug-87 13:19:47" il:{qv}<jellinek>tools>lex-tool.\;1)


; Copyright (c) 1987 by Xerox Corporation.  All rights reserved.

(il:prettycomprint il:debugger-contextcoms)

(il:rpaqq il:debugger-contextcoms (

(il:* il:|;;;| "Debugger-Context -- fix the Xerox Lisp debugger so that you can work with lexically-defined functions, variables, blocks, and tag-bodies sensibly.")

                                   

(il:* il:|;;;| "Written out of frustration by Herb Jellinek, 13-Aug-87.")

                                   (il:functions init-debugger-context lex-do-event open-lex-env)
                                   (il:variables xcl::*environment*)
                                   (il:p (init-debugger-context))
                                   (il:commands "lex" "unlex")
                                   (il:prop il:makefile-environment il:debugger-context)))



(il:* il:|;;;| 
"Debugger-Context -- fix the Xerox Lisp debugger so that you can work with lexically-defined functions, variables, blocks, and tag-bodies sensibly."
)




(il:* il:|;;;| "Written out of frustration by Herb Jellinek, 13-Aug-87.")


(defun init-debugger-context nil "Set things up for the DEBUGGER-CONTEXT hack"
                                 (undoably (setf *per-exec-variables* 
                                                             (il:* il:\; 
                                          "cause *environment* to be bound to nil in each executive.")

                                                 (acons 'xcl::*environment* nil *per-exec-variables*)
                                                 )           (il:* il:\; 
                                          "\"advise\" do-event to look at *environment* for its env.")

                                        (unless (fboundp 'old-do-event)
                                               (setf (symbol-function 'old-do-event)
                                                     (symbol-function 'il:do-event))
                                               (setf (symbol-function 'il:do-event)
                                                     (symbol-function 'lex-do-event)))))


(defun lex-do-event (original-input env &optional (fn nil function-p)) 
                                             "Replacement for the executive's old DO-EVENT function."
   (if function-p (old-do-event original-input (or env xcl::*environment*)
                         fn)
       (old-do-event original-input (or env xcl::*environment*))))


(defun open-lex-env nil "Finds the 'current' lex env and makes this debugger instance use it"
                        (let ((frame-vars (il:stkargs il:lastpos)))
                             (declare (special il:lastpos))
                             (dolist (value frame-vars (format t ";; ? found no lexical environment")
                                            )
                                    (if (il:environment-p value)
                                        (progn (setq xcl::*environment* value)
                                               (format t ";; set lexical environment")
                                               (return))))))


(defvar xcl::*environment* nil)

(init-debugger-context)

(defcommand ("lex" :debugger) nil 
                              "Sets the debugger's lexical environment to that of the selected frame"
                                  (open-lex-env)             (il:* il:\; "")

                                  (values))


(defcommand ("unlex" :debugger) nil "Unsets the lexical environment in the debugger" (setq 
                                                                                   xcl::*environment* 
                                                                                           nil)
                                    (format t ";; unset lexical environment")
                                    (values))


(il:putprops il:debugger-context il:makefile-environment (:readtable "XCL" :package "XCL-USER"))
(il:putprops il:debugger-context il:copyright ("Xerox Corporation" 1987))
il:stop