|
|
1.1 root 1: ; -*- Package:SYSTEM-INTERNALS; Mode:LISP; Base:8 -*-
2: ; MACHINE MISCELLANEOUS FUNCTIONS NOT WORTHY OF BEING IN QFCTNS
3: ; ** (c) Copyright 1980 Massachusetts Institute of Technology **
4: (setq rcs-describe-
5: "$Header: describe.l,v 1.3 85/03/24 11:23:34 sklower Exp $")
6:
7: (setq SCCS-describe "@(#) describe.l 1.1 83/01/27 @(#)")
8:
9: ;Describe anything
10:
11: (environment-lmlisp (compile eval) (files struct flavorm))
12:
13:
14: (declare (special indent))
15:
16: (defun describe (anything &optional no-complaints &aux (indent 0))
17: (describe-2 anything no-complaints))
18:
19: (defun describe-2 (anything no-complaints &aux type)
20: (cond ((named-structure-p anything)
21: (describe-defstruct anything))
22: ((and (instancep anything)
23: (get-handler-for anything ':describe))
24: (send anything ':describe))
25: ((:typep anything 'flavor)
26: (describe-flavor anything))
27: ((arrayp anything)
28: (describe-array anything))
29: ((symbolp anything)
30: (describe-symbol anything))
31: ((listp anything)
32: (describe-list anything))
33: ((floatp anything)
34: (describe-flonum anything))
35: ((bigp anything)
36: (describe-bignum anything))
37: ((fixp anything)
38: (format t "~%~vX~R is ~[even~;odd~]"
39: indent anything (if (evenp anything) 0 1)))
40: ((not no-complaints)
41: (format t "~%I don't know how to describe ~S" anything)))
42: (terpri)
43: anything)
44:
45: (defun describe-1 (thing) ;an internal subroutine
46: (cond ((or (null thing) ;Don't recursively describe relatively boring things
47: (numberp thing) (symbolp thing) (stringp thing))
48: nil)
49: (t (let ((indent (+ indent 4)))
50: (describe-2 thing t))
51: (terpri))))
52:
53: (defun describe-symbol (sym)
54: (cond ((boundp sym)
55: (let ((prinlevel 2) (prinlength 3))
56: (format t "~%~vXThe value of ~S is ~S" indent sym (symeval sym)))
57: (describe-1 (symeval sym))))
58: (cond ((fboundp sym)
59: (let ((prinlevel 2) (prinlength 3))
60: (format t "~%~vX~S is the function ~S: ~S"
61: indent sym (getd sym) '(???)))
62: (describe-1 (getd sym))))
63: (do ((pl (plist sym) (cddr pl))
64: (prinlevel 2)
65: (prinlength 3))
66: ((null pl))
67: ; (format t "~%~~vXS has property ~S: ~S" ; SMH@MIT-EMS
68: (format t "~%~vX~S has property ~S: ~S"
69: indent sym (car pl) (cadr pl))
70: (describe-1 (cadr pl)))
71: nil)
72:
73: (defun describe-list (l)
74: (format t "~%~vX~S is a list" indent l))
75:
76: ;Fixed indent botch: this is not necessarily called from describe! SMH@EMS
77: (defun describe-defstruct
78: (x &optional defstruct-type
79: &aux description
80: (indent (cond ((and (boundp 'indent) (fixp indent)) indent)
81: (t 0))))
82: (setq description (get (or defstruct-type (named-structure-symbol x))
83: 'defstruct-description))
84: ; (format t "~%~vX~S is a ~S~%" indent x (defstruct-description-name)) SMH@EMS
85: (format t "~%~vX~S is a ~S~%" indent x
86: (defstruct-description-name description))
87: (do l (defstruct-description-slot-alist) (cdr l) (null l)
88: (format t "~vX ~30A~S~%"
89: indent
90: (concat (caar l) ":")
91: (eval `(,(defstruct-slot-description-ref-macro-name (cdar l))
92: ',x)))))
93:
94: (defun describe-fclosure (cl)
95: (format t "~vX~%~S is an fclosure of ~S:~%" cl (fclosure-function cl))
96: (loop for pair in (fclosure-alist cl)
97: do (format t "~vX Value cell of ~S: ~32,7S~%"
98: indent
99: (car pair) (cadr pair))))
100:
101: (defun describe-flonum (x)
102: (format t "~%~vX~S is a flonum.~% " indent x)
103: ;; (format T "Excess-2000 exponent ~O, 32-bit mantissa ~O~4,48O~4,48O (including sign)")
104: )
105:
106: (defun describe-bignum (x)
107: (let ((len (haulong x))
108: (barf nil))
109: (format t "~&~S is a bignum.~&It is ~R word~:P long."
110: x len)
111: (terpri))
112: x)
113:
114: (defun describe-array (array &aux arraydims ndims)
115: (cond ((arrayp array)
116: (format t "~vX~%This is a ~S type array."
117: indent (car (getaux array)))
118: (setq arraydims (cdr (arraydims array)))
119: (setq ndims (length arraydims))
120: (cond ((> ndims 1)
121: (format t "~vX~%It is ~D-dimensional, with dimensions "
122: indent ndims)
123: (do l arraydims (cdr l) (null l)
124: (format t "~s " (car l))))
125: (t (format t "~%It is ~S long." (car arraydims)))))
126: (t (ferror nil "~S is not an array" array))))
127:
128: (declare (macros t))
129:
130: (defmacro mapatoms (fcnt) `(mapc ,fcnt (oblist)))
131:
132: (declare (special apropos-substring return-list))
133:
134: (defun apropos (apropos-substring &rest rest
135: &aux return-list)
136: rest
137: (mapatoms #'apropos-1 pkg)
138: return-list)
139:
140: (defun apropos-1 (symbol)
141: (cond ((within-string apropos-substring (get_pname symbol))
142: (push symbol return-list)
143: (format t "~%~s" symbol)
144: (and (fboundp symbol)
145: (format t " - Function"))
146: (and (boundp symbol)
147: (cond ((fboundp symbol) (princ ", Bound"))
148: (t (princ " - Bound")))))))
149:
150: (defun within-string (s1 s2 &aux (len (flatc s1)))
151: (loop for i from 1 to (flatc s2)
152: with fc = (getcharn s1 1)
153: when (and (= (getcharn s2 i) fc)
154: (eqstr (substring s2 i len) s1))
155: return t))
156:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.