(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10)
(FILECREATED "16-May-90 18:23:44" |{DSK}<usr>local>lde>lispcore>sources>INSPECT-CLOSURE.;2| 5126   

      |changes| |to:|  (VARS INSPECT-CLOSURECOMS)

      |previous| |date:| " 3-Feb-88 15:15:04" 
|{DSK}<usr>local>lde>lispcore>sources>INSPECT-CLOSURE.;1|)


; Copyright (c) 1988, 1990 by Venue & Xerox Corporation.  All rights reserved.

(PRETTYCOMPRINT INSPECT-CLOSURECOMS)

(RPAQQ INSPECT-CLOSURECOMS (

(* |;;;| "A nicer inspector for lexical closures.")

                                (FUNCTIONS INSPECT-CLOSURE CLOSURE-PROPERTIES CLOSURE-FETCHFN 
                                       CLOSURE-STOREFN)
                                (ADDVARS (INSPECTMACROS ((FUNCTION CLOSURE-P) . INSPECT-CLOSURE)))))



(* |;;;| "A nicer inspector for lexical closures.")


(CL:DEFUN INSPECT-CLOSURE (CLOSURE TYPE WHERE)
   (INSPECTW.CREATE CLOSURE (CLOSURE-PROPERTIES CLOSURE)
          'CLOSURE-FETCHFN
          'CLOSURE-STOREFN NIL NIL NIL NIL NIL NIL #'(CL:LAMBDA (PROP DATUM)
                                                            (CL:IF (NULL (CDR PROP))
                                                                NIL
                                                                (CAR PROP)))))

(CL:DEFUN CLOSURE-PROPERTIES (CLOSURE)
   "Make up a property description for a closure."

   (* |;;| "Does not list fields that aren't present in the closure.  Tags the fields present with a dummy field, which the inspect module is kind enough to provide.")

   (LIST* '("function" FUNCTION)                             (* \; "The function in the closure.")
          (CL:MAPCAN                                         (* \; 
                                             "Here we compute the properties from the environment.")
                 #'(CL:LAMBDA (SUB-ENV-NAME SUB-ENV-GET &OPTIONAL (SUB-ENV (CL:FUNCALL SUB-ENV-GET
                                                                                  (
                                                                                  CLOSURE-ENVIRONMENT
                                                                                   CLOSURE))))
                          (CL:WHEN SUB-ENV                   (* \; 
                               "Only display if there's something in this part of the environment.")
                              (LIST* `(,(CL:STRING-DOWNCASE (CL:SYMBOL-NAME SUB-ENV-NAME)))
                                                             (* \; "Dummy field printed in middle.")
                                     (CL:DO ((PLIST SUB-ENV (CDDR PLIST))
                                             (PROP-SPECS NIL))
                                            ((NULL PLIST)
                                             PROP-SPECS)
                                         (CL:PUSH `(,(CL:FIRST PLIST)
                                                    ,SUB-ENV-NAME)
                                                PROP-SPECS)))))
                 '(VARS FUNCTIONS BLOCKS TAGBODIES)
                 '(ENVIRONMENT-VARS ENVIRONMENT-FUNCTIONS ENVIRONMENT-BLOCKS ENVIRONMENT-TAGBODIES))))

(CL:DEFUN CLOSURE-FETCHFN (CLOSURE PROP)
   (COND
      ((NULL (CDR PROP))
       (CAR PROP))
      ((EQ (CADR PROP)
           'FUNCTION)
       (CLOSURE-FUNCTION CLOSURE))
      (T (LET (ACCESSOR)
              (CL:IF (SETQ ACCESSOR (CDR (CL:ASSOC (CADR PROP)
                                                '((VARS . ENVIRONMENT-VARS)
                                                  (FUNCTIONS . ENVIRONMENT-FUNCTIONS)
                                                  (BLOCKS . ENVIRONMENT-BLOCKS)
                                                  (TAGBODIES . ENVIRONMENT-TAGBODIES))
                                                :TEST
                                                'EQ)))
                  (CL:GETF (CL:FUNCALL ACCESSOR (CLOSURE-ENVIRONMENT CLOSURE))
                         (CAR PROP)))))))

(CL:DEFUN CLOSURE-STOREFN (CLOSURE PROP VALUE)
   (COND
      ((NULL (CDR PROP))
       NIL)
      ((EQ (CADR PROP)
           'FUNCTION)
       (CL:SETF (CLOSURE-FUNCTION CLOSURE)
              VALUE))
      (T (LET (ACCESSOR)
              (CL:IF (SETQ ACCESSOR (CDR (CL:ASSOC (CADR PROP)
                                                '((VARS . ENVIRONMENT-VARS)
                                                  (FUNCTIONS . ENVIRONMENT-FUNCTIONS)
                                                  (BLOCKS . ENVIRONMENT-BLOCKS)
                                                  (TAGBODIES . ENVIRONMENT-TAGBODIES))
                                                :TEST
                                                'EQ)))
                  (LET ((PLIST (CL:FUNCALL ACCESSOR (CLOSURE-ENVIRONMENT CLOSURE))))
                       (CL:SETF (CL:GETF PLIST (CAR PROP))
                              VALUE)))))))

(ADDTOVAR INSPECTMACROS ((FUNCTION CLOSURE-P) . INSPECT-CLOSURE))
(PUTPROPS INSPECT-CLOSURE COPYRIGHT ("Venue & Xerox Corporation" 1988 1990))
(DECLARE\: DONTCOPY
  (FILEMAP (NIL)))
STOP
