4.4BSD/usr/src/old/lisp/pearl/print.l
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print.l ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Functions for converting from internal form to a printable form.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Copyright (c) 1983 , The Regents of the University of California.
; All rights reserved.
; Authors: Joseph Faletti and Michael Deering.
; Convert a predicate, which might be a structure, to printable form.
(de convertpreds (pred)
(cond ((or (litatom pred)
(dtpr pred)
(numberp pred))
pred)
((structurep pred) (allform pred))
((definitionp pred) (getpname pred))
( t pred)))
; Reverse assoc through a list of cons-cells -- look at the CDRs
; for value and return the first cons-cell that matches.
(de revassq (value alist)
(while alist ; is not NIL
(and (eq value (cdar alist))
(return (car alist)))
(setq alist (cdr alist))))
; Convert an ordinal to printable form.
(defmacro ppsetform (slotval ppset)
`(cond ((eq 'int ,ppset) ,slotval)
( t (let ((assqlist (eval (ordatom ,ppset)))
assqresult)
(cond ((setq assqresult (revassq ,slotval assqlist))
(car assqresult))
((\=& 0 ,slotval) '*zero-ordinal-value*)
( t (list ,ppset ,slotval)))))))
; Convert a stream to printable form.
(defmacro streamform (item)
`(cond ((eq t (cadr ,item)) (list '*function-stream:*
(structureform (cddr ,item))))
((or *fullprint*
(not *streamprintlength*))
(list '*stream:*
(structureform (cadr ,item))
(mapcan (funl (struct)
(cond ((eq '*db* struct) nil)
( t (ncons (structureform struct)))))
(cddr ,item))))
( t
(list
'*stream:*
(structureform (cadr ,item))
(let
((rest (cddr ,item))
(result (ncons nil))
next)
(cond ((dtpr (car rest))
; stream built by expandedfetch.
(let ((itemnum 1)
bucket)
(while (setq bucket (pop rest))
(mapc
(funl (next)
(or (eq '*db* next)
(progn
(and (>& itemnum *streamprintlength*)
(progn
(tconc result '|...|)
(return (car result))))
(tconc result (structureform next))
(setq itemnum (1+ itemnum))
)))
bucket)
(or rest
(return (car result))))))
( t (for itemnum 1 *streamprintlength*
(while (and (setq next (pop rest))
(eq '*db* next))
) ; do nothing
(or next
(return (car result)))
(tconc result (structureform next)))))
(and rest
(tconc result '|...|))
(car result))))))
; Convert a symbol to printable form.
(defmacro symbolform (item)
`(getsymbolpname ,item))
; Convert an equivalence class list to printable form.
(defmacro equivclassform (equiv)
`(let ((equivclass ,equiv))
(mapcan (funl (var)
(cond ((dtpr var) ; a local var
; filter out variables which are no longer
; members of the equivalence class
(and (eq (cdr var) equivclass)
(ncons (list '*var* (car var)))))
( t ; otherwise a global var
(and (eq (eval var) equivclass)
(ncons (list '*global* var))))))
(cdr equivclass))))
; Convert a definition to printable form.
(defmacro defform (item)
`(cons 'definition-of:
(structureform (getdefaultinst ,item))))
; Convert the constant portion of a slot
(defmacro slotconstform (item typenum ppset)
`(selectq ,typenum
(0 (or (and *abbrevprint*
(getabbrev ,item))
(structureform ,item)))
(1 (symbolform ,item))
(2 (ppsetform ,item ,ppset))
(3 (allform ,item))
(otherwise
(let ((newtypenum (- ,typenum 4.)))
(cond ((dtpr ,item)
(mapcar
(funl (singleitem)
(listitemform singleitem newtypenum ,ppset))
,item))
; otherwise, in case value is somehow not a list,
; do your best.
(t (allform ,item)))))))
; Makes a function out of slotconstform for mapping on a setof slot.
(de listitemform (item typenum ppset)
(slotconstform item typenum ppset))
; Macro version of slotconstform for normal use on a slot's value.
(defmacro slotitemform (printval)
`(let ((item ,printval)
(typenum (getslottype slotnum defblock))
(ppset (getppset slotnum defblock)))
(slotconstform item typenum ppset)))
; Convert a slot from internal form to a list form.
(dm slotform (none) ; but assumes SLOTNUM, ITEM, PRINTVAL and PRINTVAR.
'(progn
(setq printval (getslotvalue slotnum item))
(selectq (getslotvaluetype slotnum item)
(CONSTANT (slotitemform printval))
(LOCAL (cond ((eq (punbound) (cdr printval))
(list '*var* (car printval)))
((equivclassp (cdr printval))
(list (list '*var* (car printval))
; Unfortunate kludge to get rid of \'s.
(ncons 'pearlequals)
(equivclassform (cdr printval))))
( t (list (list '*var* (car printval))
; Unfortunate kludge to get rid of \'s.
(ncons 'pearlequals)
(slotitemform (cdr printval))))))
(ADJUNCT (list (slotitemform (car printval))
(ncons 'pearlequals)
(let ((var (cdr printval)))
(cond ((dtpr var)
(list '*var* (car var)))
( t (list '*global* var))))))
(GLOBAL (cond ((eq (punbound) (eval printval))
(list '*global* printval))
((equivclassp (eval printval))
(list (list '*global* printval)
; Unfortunate kludge to get rid of \'s.
(ncons 'pearlequals)
(equivclassform (eval printval))))
( t (list (list '*global* printval)
; Unfortunate kludge to get rid of \'s.
(ncons 'pearlequals)
(slotitemform (eval printval)))))))))
(de structureform (item)
(let* ((curlist (ncons nil))
(defblock (getdefinition item))
(basehooks (getbasehooks defblock))
ppset
printvar
printval)
(cond ((and *uniqueprint*
; if there then return it.
(cdr (assq item *uniqueprintlist*))))
( t (tconc curlist (getpname defblock))
(and *fullprint*
basehooks
(tconc curlist (cons 'if basehooks)))
(and *uniqueprint*
(push (cons item (car curlist))
*uniqueprintlist*))
(for slotnum 1 (getstructlength defblock)
(tconc curlist
(nconc (ncons (car
(getslotname slotnum defblock)))
(ncons (slotform))
(and *fullprint*
(mapcar (function convertpreds)
(getpred slotnum item)))
(and *fullprint*
(getslothooks slotnum item)))))
(car curlist)))))
; Convert any combination of PEARL and Lisp items (possibly from internal
; form) to a printable list structure.
(de allform (item)
(cond ((hunkp item)
(selectq (gettypetag item)
(*pearlinst* (structureform item))
(*pearlsymbol* (symbolform item))
(*pearldef* (defform item))
(*pearldb* (list 'database: (getdbname item)))
(*pearlinactivedb* (list 'Inactive 'Database))
(otherwise item))) ; arbitrary hunk?.
((streamp item) (streamform item))
((equivclassp item) (equivclassform item))
((atom item) item)
((dtpr item) (cons (allform (car item))
(allform (cdr item))))
; Else return item (arbitrary pieces of core?).
( t item)))
; Convert a PEARL item in full detail and SPRINT the result.
(de fullform (item)
(let ((*fullprint* t)
(*abbrevprint* nil)
(*uniqueprintlist* nil))
(allform item)))
; Convert a PEARL item using abbreviations and SPRINT the result.
(de abbrevform (item)
(let ((*abbrevprint* t)
(*fullprint* nil)
(*uniqueprintlist* nil))
(allform item)))
; Normal function to convert a PEARL item and SPRINT the result.
(de valform (item)
(let ((*fullprint* nil)
(*abbrevprint* nil)
(*uniqueprintlist* nil))
(allform item)))
; Convert any PEARL item using whatever the current settings of
; *abbrevprint*, *fullprint* and *uniqueprint* are,
; and SPRINT the result.
; BUT, don't bother if *quiet* is non-nil.
(de allprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (allform item) lmar rmar))
'*invisible*)
(de structureprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (structureform item) lmar rmar))
'*invisible*)
(de symbolprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (symbolform item) lmar rmar))
'*invisible*)
(de streamprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (streamform item) lmar rmar))
'*invisible*)
(de fullprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (fullform item) lmar rmar))
'*invisible*)
(de valprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (valform item) lmar rmar))
'*invisible*)
(de abbrevprint (item &optional (lmar 0) (rmar 0))
(or *quiet*
(sprint (abbrevform item) lmar rmar))
'*invisible*)
; Run some commands but silence any printing it normally does.
(df quiet (command)
(let ((*quiet* t))
(eval `(progn ,@command))))
; Print out a data base, printing only buckets that have something in them.
(de printdb (&optional (db *db*))
(let ((db1 (getdb1 db))
(db2 (getdb2 db))
bucket)
(or (databasep db)
(progn (msg t "PRINTDB: Argument is not a database." t)
(pearlbreak)))
(msg t "DB-Name: " (getdbname db))
(msg t "Active: " (getdbactive db))
(msg t "Children: " (mapcar (function pname) (getdbchildren db)))
(msg t "Parent: " (pname (getdbparent db)))
(msg t "DB1:")
(and db1
(for slotnum 0 (1- *db1size*)
(and (setq bucket (remq '*db* (cxr slotnum db1)))
(progn (msg t " " slotnum ": ")
(pearlprintfn bucket)))))
(msg t "DB2:")
(and db2
(for slotnum 0 (1- *db2size*)
(and (setq bucket (remq '*db* (cxr slotnum db2)))
(progn (msg t " " slotnum ": ")
(pearlprintfn bucket)))))
'*invisible*))
; Print complete information on the internal values stored in a structure
; and its definition (or a definition and its default instance).
(de debugprint (item)
(let (def name)
(cond ((definitionp item)
(setq def item)
(setq item (getdefaultinst def)))
( t (setq def (getdefinition item))))
(and (setq name (getabbrev item))
(msg t "******** " name " ********"))
(msg t "Definition:")
(msg t " Unique\#: " (getuniquenum def))
(msg " Length: " (getstructlength def))
(msg " DefaultInst: " (getdefaultinst def))
(msg t " Isa: " (getisa def))
(msg t " Pname: " (getpname def))
(msg " HashAlias: " (gethashalias def))
(msg " ExpansionList: " (getexpansionlist def))
(msg t " BaseIfs: " (getbasehooks def))
(msg t "Individual:")
(msg " Abbrev: " (getabbrev item))
(msg t " AList: " (getalist item))
(msg " AListcp: " (getalistcp item))
(for slotnum 1 (getstructlength def)
(msg t t "***Slotnum " slotnum
" : " (getslotname slotnum def))
(msg t "Formatinfo: " (getformatinfo slotnum def))
(msg " HashInfo: " (gethashinfo slotnum def))
(msg " Enforce: " (getenforce slotnum def))
(msg " Type: " (getslottype slotnum def))
(msg " PPSet: " (getppset slotnum def))
(msg t "ValueType: " (getslotvaluetype slotnum item))
(msg " Internal Value: " (getslotvalue slotnum item))
(msg t "Value: " (getvalue slotnum item))
(msg " Preds: " (getpred slotnum item))
(msg " SlotIfs: " (getslothooks slotnum item)))
'*invisible*))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; the print functions for use with the top level, msg, and the
; trace, break, etc. packages.
; standard trace print should use allform after turning off tracing.
(de pearltraceprintfn (*traceval*)
; Set the $tracemute flag to t so that tracing won't be done
; inside allform.
(let ((\$tracemute t))
(print (allform *traceval*))))
; standard showstack print should use allform.
(de pearlshowstackprintfn (*showstackval*)
(print (allform *showstackval*)))
; standard break print should use allform.
(de pearlbreakprintfn (*breakval*)
(print (allform *breakval*)))
; standard fix print should use allform.
(de pearlfixprintfn (*fixval*)
(print (allform *fixval*)))
; msg should allform, unless *invisible*.
(de msgprintfn (*msgval*)
(or (eq '*invisible* *msgval*)
(patom (allform *msgval*))))
; printing in a trace-break should allprint.
(de pearltracebreakprintfn (*printval*)
(allprint *printval* 3))
; standard print should allprint.
(de pearlprintfn (*printval*)
(allprint *printval* 3))
; standard dskin print should use allform unless an atom.
(de dskprintfn (*dskval*)
(cond ((atom *dskval*) (patom *dskval*))
( t (print (allform *dskval*)))))
; vi: set lisp: