home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / e / e070 / 4.ddi / LISPLIB / DESCRIBE.LSP < prev    next >
Encoding:
Text File  |  1984-11-06  |  5.3 KB  |  129 lines

  1. ;;; Copyright (C) 1984 by Gold Hill Computers
  2.  
  3. ;;;    (DESCRIBE obj)
  4. ;;;        Prints some information about the object
  5.  
  6. (DEFUN DESCRIBE (OBJ)
  7.   (TERPRI *STANDARD-OUTPUT*)
  8.   ;; dispatch on type of object.
  9.   (CASE (TYPE-OF OBJ)
  10.     (CONS (FORMAT *STANDARD-OUTPUT* "~S is a list of length ~D."
  11.        OBJ (LENGTH OBJ)))
  12.     (NULL (FORMAT *STANDARD-OUTPUT* "NIL is the empty list."))
  13.     (FIXNUM (FORMAT *STANDARD-OUTPUT*
  14.                "~S is an ~:[even~;odd~] fixnum." OBJ (ODDP OBJ)))
  15.     ((DOUBLE-FLOAT SINGLE-FLOAT)
  16.      (LET (SEG OFF TEMP
  17.            (SINGLEP (EQ (TYPE-OF OBJ) 'SINGLE-FLOAT)))
  18.        (MULTIPLE-VALUE-SETQ (OFF SEG) (%POINTER OBJ))
  19.        (FORMAT *STANDARD-OUTPUT* 
  20.      "~S is a ~:[double~;single~] precision floating point number."
  21.      OBJ SINGLEP)
  22.        (FORMAT *STANDARD-OUTPUT* "~%   Its internal representation is: #x")
  23.        (DOTIMES (I (IF SINGLEP 4 8))
  24.      (FORMAT *STANDARD-OUTPUT* "~:[0~X~;~X~]"
  25.        (> (SETQ TEMP (%CONTENTS SEG (+ OFF I 1))) 15) TEMP))
  26.        (FORMAT *STANDARD-OUTPUT* ".")))
  27.     (SYMBOL
  28.      (FORMAT *STANDARD-OUTPUT* "~S is a symbol." OBJ)
  29.      (FORMAT *STANDARD-OUTPUT*
  30.         "~%   Its ~:[global~;local~] value is~:[ unbound~;: ~S~]." 
  31.        (MULTIPLE-VALUE-BIND (OFF SEG) (%POINTER OBJ)
  32.            (LOGBITP 7 (%CONTENTS SEG (+ OFF 16))))
  33.        (BOUNDP OBJ)
  34.        (AND (BOUNDP OBJ) (SYMBOL-VALUE OBJ)))
  35.      (FORMAT *STANDARD-OUTPUT*
  36.         "~%   Its function definition is~:[ unbound~;: ~S~]."
  37.        (FBOUNDP OBJ) (AND (FBOUNDP OBJ)(SYMBOL-FUNCTION OBJ)))
  38.      (FORMAT *STANDARD-OUTPUT* "~%   Its property list")
  39.      (IF (NULL (SYMBOL-PLIST OBJ))
  40.          (FORMAT *STANDARD-OUTPUT* " is empty.")
  41.          (PROGN
  42.             (FORMAT *STANDARD-OUTPUT* " contains:")
  43.             (DO ((I (SYMBOL-PLIST OBJ) (CDDR I)))
  44.                 ((NULL I))
  45.               (FORMAT *STANDARD-OUTPUT*
  46.                  "~%    Property: ~S, Value: ~S"
  47.                  (CAR I)(CADR I))))))
  48.     (COMPILED-FUNCTION
  49.       (FORMAT *STANDARD-OUTPUT* "~S is a compiled function." OBJ))
  50.     (CLOSURE
  51.       (FORMAT *STANDARD-OUTPUT* "~S is a closure." OBJ)
  52.       (FORMAT *STANDARD-OUTPUT*
  53.          "~%   Its function is: ~S.~%   Its environment is: ~S" 
  54.     (CAR OBJ) (CDR OBJ)))
  55.     (STACK-GROUP
  56.       (LET (X Y)
  57.         (FORMAT *STANDARD-OUTPUT*"~S is a stack group." OBJ)
  58.         (MULTIPLE-VALUE-BIND (OFF SEG)(%POINTER OBJ)
  59.           (FORMAT *STANDARD-OUTPUT*
  60.          "~%   Its state is: ~[ACTIVE~;RESUMABLE~;BROKEN~;EXHAUSTED~]."
  61.          (LSH (%CONTENTS SEG (+ OFF 41)) -1))
  62.       (MULTIPLE-VALUE-SETQ (NIL X Y) (%CONTENTS SEG (+ OFF 15)))
  63.       (FORMAT *STANDARD-OUTPUT* "~%   Its resumer is: ~S."
  64.          (%UNPOINTER Y X))
  65.       (MULTIPLE-VALUE-SETQ (NIL X) (%CONTENTS SEG (+ 1 OFF)))
  66.       (MULTIPLE-VALUE-SETQ (NIL Y) (%CONTENTS SEG (+ 3 OFF)))
  67.       (FORMAT *STANDARD-OUTPUT* "~%   Its stack size is: ~U. bytes."
  68.          (- X Y))
  69.       (MULTIPLE-VALUE-SETQ (NIL X) (%CONTENTS SEG (+ 5 OFF)))
  70.       (MULTIPLE-VALUE-SETQ (NIL Y) (%CONTENTS SEG (+ 7 OFF)))
  71.       (FORMAT *STANDARD-OUTPUT*
  72.          "~%   Its special stack size is: ~U. bytes." (- X Y))
  73.       (MULTIPLE-VALUE-SETQ (NIL X) (%CONTENTS SEG (+ 42 OFF)))
  74.       (FORMAT *STANDARD-OUTPUT*
  75.          "~%   It contains ~D. dynamic variable bindings."
  76.           (DO ((I 0 (1+ I))
  77.                (X (+ OFF 44)))
  78.               (())
  79.             (SETF (VALUES NIL X)(%CONTENTS SEG X))
  80.             (WHEN (ZEROP X) (RETURN I))))            
  81.       (FORMAT *STANDARD-OUTPUT*
  82.          "~%   Its special stack pointer is: #x~X." X)
  83.       ;; following is not valid if we are describing the current SG
  84.       (UNLESS (EQ OBJ *CURRENT-STACK-GROUP*)
  85.         (MULTIPLE-VALUE-SETQ (NIL X) (%CONTENTS SEG (+ 39 OFF)))
  86.         (FORMAT *STANDARD-OUTPUT* "~%   Its stack pointer is: #x~X." X)
  87.         (MULTIPLE-VALUE-SETQ (NIL X Y) (%CONTENTS SEG (+ OFF 31)))
  88.         (FORMAT *STANDARD-OUTPUT* "~%   Its program counter is: ~X:~X."
  89.            Y X)
  90.         (MULTIPLE-VALUE-SETQ (NIL X) (%CONTENTS SEG (+ 35 OFF)))
  91.         (FORMAT *STANDARD-OUTPUT* "~%   Its frame pointer is: #x~X." X)
  92.       )))
  93.      )
  94.     (OTHERWISE
  95.       (COND ((ARRAYP OBJ)
  96.          (FORMAT *STANDARD-OUTPUT*
  97.             "~S is a ~:[vector~;string~] of length ~D."
  98.             OBJ (STRINGP OBJ) (ARRAY-LENGTH OBJ))
  99.          (WHEN (ARRAY-HAS-LEADER-P OBJ)
  100.            (FORMAT *STANDARD-OUTPUT*
  101.               "~%   It has an array leader with the contents:")
  102.            (DOTIMES (I (ARRAY-LEADER-LENGTH OBJ))
  103.              (FORMAT *STANDARD-OUTPUT* "~%    ~D : ~S"
  104.             I (ARRAY-LEADER OBJ I))))
  105.          (WHEN (AND (NOT (STRINGP OBJ)) (PLUSP (LENGTH OBJ)))
  106.            (FORMAT *STANDARD-OUTPUT* "~&   Its elements are:")
  107.            (DOTIMES (I (LENGTH OBJ))
  108.              (FORMAT *STANDARD-OUTPUT* "~&    ~D : ~S" I (AREF OBJ I)))))
  109.         ((NAMED-STRUCTURE-P OBJ)
  110.          (FORMAT *STANDARD-OUTPUT* "~S is a Named Structure of type ~S."
  111.            OBJ (TYPE-OF OBJ))
  112.          (FORMAT *STANDARD-OUTPUT* "~%   Its slot names and values are:")
  113.          (LET* ((DESCR (GET (TYPE-OF OBJ) 'STRUCTURE-DESCRIPTOR))
  114.             (CONC-NAME (ASSOC 'CONC-NAME (CADDR DESCR))))
  115.         (SETQ CONC-NAME (COND ((NULL CONC-NAME)
  116.                        (STRING-APPEND (TYPE-OF OBJ) #\-))
  117.                       ((SECOND CONC-NAME))
  118.                       (T "")))
  119.             (DOLIST (X (CAR DESCR))
  120.               (FORMAT *STANDARD-OUTPUT* "~&    Name: ~S, Value: ~S"
  121.             (CAR X) (EVAL `(,(INTERN (STRING-APPEND CONC-NAME 
  122.                                 (CAR X)))
  123.                     ',OBJ)))
  124.         ))
  125.          )))
  126.     )
  127.   (TERPRI *STANDARD-OUTPUT*)
  128.   (VALUES NIL))
  129.