|
|
1.1 ! root 1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print.l ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! 2: ; Functions for converting from internal form to a printable form. ! 3: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! 4: ; Copyright (c) 1983 , The Regents of the University of California. ! 5: ; All rights reserved. ! 6: ; Authors: Joseph Faletti and Michael Deering. ! 7: ! 8: ; Convert a predicate, which might be a structure, to printable form. ! 9: (de convertpreds (pred) ! 10: (cond ((or (litatom pred) ! 11: (dtpr pred) ! 12: (numberp pred)) ! 13: pred) ! 14: ((structurep pred) (allform pred)) ! 15: ((definitionp pred) (getpname pred)) ! 16: ( t pred))) ! 17: ! 18: ; Reverse assoc through a list of cons-cells -- look at the CDRs ! 19: ; for value and return the first cons-cell that matches. ! 20: (de revassq (value alist) ! 21: (while alist ; is not NIL ! 22: (and (eq value (cdar alist)) ! 23: (return (car alist))) ! 24: (setq alist (cdr alist)))) ! 25: ! 26: ; Convert an ordinal to printable form. ! 27: (defmacro ppsetform (slotval ppset) ! 28: `(cond ((eq 'int ,ppset) ,slotval) ! 29: ( t (let ((assqlist (eval (ordatom ,ppset))) ! 30: assqresult) ! 31: (cond ((setq assqresult (revassq ,slotval assqlist)) ! 32: (car assqresult)) ! 33: ((\=& 0 ,slotval) '*zero-ordinal-value*) ! 34: ( t (list ,ppset ,slotval))))))) ! 35: ! 36: ; Convert a stream to printable form. ! 37: (defmacro streamform (item) ! 38: `(cond ((eq t (cadr ,item)) (list '*function-stream:* ! 39: (structureform (cddr ,item)))) ! 40: ((or *fullprint* ! 41: (not *streamprintlength*)) ! 42: (list '*stream:* ! 43: (structureform (cadr ,item)) ! 44: (mapcan (funl (struct) ! 45: (cond ((eq '*db* struct) nil) ! 46: ( t (ncons (structureform struct))))) ! 47: (cddr ,item)))) ! 48: ( t ! 49: (list ! 50: '*stream:* ! 51: (structureform (cadr ,item)) ! 52: (let ! 53: ((rest (cddr ,item)) ! 54: (result (ncons nil)) ! 55: next) ! 56: (cond ((dtpr (car rest)) ! 57: ; stream built by expandedfetch. ! 58: (let ((itemnum 1) ! 59: bucket) ! 60: (while (setq bucket (pop rest)) ! 61: (mapc ! 62: (funl (next) ! 63: (or (eq '*db* next) ! 64: (progn ! 65: (and (>& itemnum *streamprintlength*) ! 66: (progn ! 67: (tconc result '|...|) ! 68: (return (car result)))) ! 69: (tconc result (structureform next)) ! 70: (setq itemnum (1+ itemnum)) ! 71: ))) ! 72: bucket) ! 73: (or rest ! 74: (return (car result)))))) ! 75: ( t (for itemnum 1 *streamprintlength* ! 76: (while (and (setq next (pop rest)) ! 77: (eq '*db* next)) ! 78: ) ; do nothing ! 79: (or next ! 80: (return (car result))) ! 81: (tconc result (structureform next))))) ! 82: (and rest ! 83: (tconc result '|...|)) ! 84: (car result)))))) ! 85: ! 86: ; Convert a symbol to printable form. ! 87: (defmacro symbolform (item) ! 88: `(getsymbolpname ,item)) ! 89: ! 90: ; Convert an equivalence class list to printable form. ! 91: (defmacro equivclassform (equiv) ! 92: `(let ((equivclass ,equiv)) ! 93: (mapcan (funl (var) ! 94: (cond ((dtpr var) ; a local var ! 95: ; filter out variables which are no longer ! 96: ; members of the equivalence class ! 97: (and (eq (cdr var) equivclass) ! 98: (ncons (list '*var* (car var))))) ! 99: ( t ; otherwise a global var ! 100: (and (eq (eval var) equivclass) ! 101: (ncons (list '*global* var)))))) ! 102: (cdr equivclass)))) ! 103: ! 104: ; Convert a definition to printable form. ! 105: (defmacro defform (item) ! 106: `(cons 'definition-of: ! 107: (structureform (getdefaultinst ,item)))) ! 108: ! 109: ; Convert the constant portion of a slot ! 110: (defmacro slotconstform (item typenum ppset) ! 111: `(selectq ,typenum ! 112: (0 (or (and *abbrevprint* ! 113: (getabbrev ,item)) ! 114: (structureform ,item))) ! 115: (1 (symbolform ,item)) ! 116: (2 (ppsetform ,item ,ppset)) ! 117: (3 (allform ,item)) ! 118: (otherwise ! 119: (let ((newtypenum (- ,typenum 4.))) ! 120: (cond ((dtpr ,item) ! 121: (mapcar ! 122: (funl (singleitem) ! 123: (listitemform singleitem newtypenum ,ppset)) ! 124: ,item)) ! 125: ; otherwise, in case value is somehow not a list, ! 126: ; do your best. ! 127: (t (allform ,item))))))) ! 128: ! 129: ; Makes a function out of slotconstform for mapping on a setof slot. ! 130: (de listitemform (item typenum ppset) ! 131: (slotconstform item typenum ppset)) ! 132: ! 133: ; Macro version of slotconstform for normal use on a slot's value. ! 134: (defmacro slotitemform (printval) ! 135: `(let ((item ,printval) ! 136: (typenum (getslottype slotnum defblock)) ! 137: (ppset (getppset slotnum defblock))) ! 138: (slotconstform item typenum ppset))) ! 139: ! 140: ; Convert a slot from internal form to a list form. ! 141: (dm slotform (none) ; but assumes SLOTNUM, ITEM, PRINTVAL and PRINTVAR. ! 142: '(progn ! 143: (setq printval (getslotvalue slotnum item)) ! 144: (selectq (getslotvaluetype slotnum item) ! 145: (CONSTANT (slotitemform printval)) ! 146: (LOCAL (cond ((eq (punbound) (cdr printval)) ! 147: (list '*var* (car printval))) ! 148: ((equivclassp (cdr printval)) ! 149: (list (list '*var* (car printval)) ! 150: ; Unfortunate kludge to get rid of \'s. ! 151: (ncons 'pearlequals) ! 152: (equivclassform (cdr printval)))) ! 153: ( t (list (list '*var* (car printval)) ! 154: ; Unfortunate kludge to get rid of \'s. ! 155: (ncons 'pearlequals) ! 156: (slotitemform (cdr printval)))))) ! 157: (ADJUNCT (list (slotitemform (car printval)) ! 158: (ncons 'pearlequals) ! 159: (let ((var (cdr printval))) ! 160: (cond ((dtpr var) ! 161: (list '*var* (car var))) ! 162: ( t (list '*global* var)))))) ! 163: (GLOBAL (cond ((eq (punbound) (eval printval)) ! 164: (list '*global* printval)) ! 165: ((equivclassp (eval printval)) ! 166: (list (list '*global* printval) ! 167: ; Unfortunate kludge to get rid of \'s. ! 168: (ncons 'pearlequals) ! 169: (equivclassform (eval printval)))) ! 170: ( t (list (list '*global* printval) ! 171: ; Unfortunate kludge to get rid of \'s. ! 172: (ncons 'pearlequals) ! 173: (slotitemform (eval printval))))))))) ! 174: ! 175: (de structureform (item) ! 176: (let* ((curlist (ncons nil)) ! 177: (defblock (getdefinition item)) ! 178: (basehooks (getbasehooks defblock)) ! 179: ppset ! 180: printvar ! 181: printval) ! 182: (cond ((and *uniqueprint* ! 183: ; if there then return it. ! 184: (cdr (assq item *uniqueprintlist*)))) ! 185: ( t (tconc curlist (getpname defblock)) ! 186: (and *fullprint* ! 187: basehooks ! 188: (tconc curlist (cons 'if basehooks))) ! 189: (and *uniqueprint* ! 190: (push (cons item (car curlist)) ! 191: *uniqueprintlist*)) ! 192: (for slotnum 1 (getstructlength defblock) ! 193: (tconc curlist ! 194: (nconc (ncons (car ! 195: (getslotname slotnum defblock))) ! 196: (ncons (slotform)) ! 197: (and *fullprint* ! 198: (mapcar (function convertpreds) ! 199: (getpred slotnum item))) ! 200: (and *fullprint* ! 201: (getslothooks slotnum item))))) ! 202: (car curlist))))) ! 203: ! 204: ; Convert any combination of PEARL and Lisp items (possibly from internal ! 205: ; form) to a printable list structure. ! 206: (de allform (item) ! 207: (cond ((hunkp item) ! 208: (selectq (gettypetag item) ! 209: (*pearlinst* (structureform item)) ! 210: (*pearlsymbol* (symbolform item)) ! 211: (*pearldef* (defform item)) ! 212: (*pearldb* (list 'database: (getdbname item))) ! 213: (*pearlinactivedb* (list 'Inactive 'Database)) ! 214: (otherwise item))) ; arbitrary hunk?. ! 215: ((streamp item) (streamform item)) ! 216: ((equivclassp item) (equivclassform item)) ! 217: ((atom item) item) ! 218: ((dtpr item) (cons (allform (car item)) ! 219: (allform (cdr item)))) ! 220: ; Else return item (arbitrary pieces of core?). ! 221: ( t item))) ! 222: ! 223: ; Convert a PEARL item in full detail and SPRINT the result. ! 224: (de fullform (item) ! 225: (let ((*fullprint* t) ! 226: (*abbrevprint* nil) ! 227: (*uniqueprintlist* nil)) ! 228: (allform item))) ! 229: ! 230: ; Convert a PEARL item using abbreviations and SPRINT the result. ! 231: (de abbrevform (item) ! 232: (let ((*abbrevprint* t) ! 233: (*fullprint* nil) ! 234: (*uniqueprintlist* nil)) ! 235: (allform item))) ! 236: ! 237: ; Normal function to convert a PEARL item and SPRINT the result. ! 238: (de valform (item) ! 239: (let ((*fullprint* nil) ! 240: (*abbrevprint* nil) ! 241: (*uniqueprintlist* nil)) ! 242: (allform item))) ! 243: ! 244: ; Convert any PEARL item using whatever the current settings of ! 245: ; *abbrevprint*, *fullprint* and *uniqueprint* are, ! 246: ; and SPRINT the result. ! 247: ; BUT, don't bother if *quiet* is non-nil. ! 248: (de allprint (item &optional (lmar 0) (rmar 0)) ! 249: (or *quiet* ! 250: (sprint (allform item) lmar rmar)) ! 251: '*invisible*) ! 252: ! 253: (de structureprint (item &optional (lmar 0) (rmar 0)) ! 254: (or *quiet* ! 255: (sprint (structureform item) lmar rmar)) ! 256: '*invisible*) ! 257: ! 258: (de symbolprint (item &optional (lmar 0) (rmar 0)) ! 259: (or *quiet* ! 260: (sprint (symbolform item) lmar rmar)) ! 261: '*invisible*) ! 262: ! 263: (de streamprint (item &optional (lmar 0) (rmar 0)) ! 264: (or *quiet* ! 265: (sprint (streamform item) lmar rmar)) ! 266: '*invisible*) ! 267: ! 268: (de fullprint (item &optional (lmar 0) (rmar 0)) ! 269: (or *quiet* ! 270: (sprint (fullform item) lmar rmar)) ! 271: '*invisible*) ! 272: ! 273: (de valprint (item &optional (lmar 0) (rmar 0)) ! 274: (or *quiet* ! 275: (sprint (valform item) lmar rmar)) ! 276: '*invisible*) ! 277: ! 278: (de abbrevprint (item &optional (lmar 0) (rmar 0)) ! 279: (or *quiet* ! 280: (sprint (abbrevform item) lmar rmar)) ! 281: '*invisible*) ! 282: ! 283: ; Run some commands but silence any printing it normally does. ! 284: (df quiet (command) ! 285: (let ((*quiet* t)) ! 286: (eval `(progn ,@command)))) ! 287: ! 288: ; Print out a data base, printing only buckets that have something in them. ! 289: (de printdb (&optional (db *db*)) ! 290: (let ((db1 (getdb1 db)) ! 291: (db2 (getdb2 db)) ! 292: bucket) ! 293: (or (databasep db) ! 294: (progn (msg t "PRINTDB: Argument is not a database." t) ! 295: (pearlbreak))) ! 296: (msg t "DB-Name: " (getdbname db)) ! 297: (msg t "Active: " (getdbactive db)) ! 298: (msg t "Children: " (mapcar (function pname) (getdbchildren db))) ! 299: (msg t "Parent: " (pname (getdbparent db))) ! 300: (msg t "DB1:") ! 301: (and db1 ! 302: (for slotnum 0 (1- *db1size*) ! 303: (and (setq bucket (remq '*db* (cxr slotnum db1))) ! 304: (progn (msg t " " slotnum ": ") ! 305: (pearlprintfn bucket))))) ! 306: ! 307: (msg t "DB2:") ! 308: (and db2 ! 309: (for slotnum 0 (1- *db2size*) ! 310: (and (setq bucket (remq '*db* (cxr slotnum db2))) ! 311: (progn (msg t " " slotnum ": ") ! 312: (pearlprintfn bucket))))) ! 313: '*invisible*)) ! 314: ! 315: ; Print complete information on the internal values stored in a structure ! 316: ; and its definition (or a definition and its default instance). ! 317: (de debugprint (item) ! 318: (let (def name) ! 319: (cond ((definitionp item) ! 320: (setq def item) ! 321: (setq item (getdefaultinst def))) ! 322: ( t (setq def (getdefinition item)))) ! 323: (and (setq name (getabbrev item)) ! 324: (msg t "******** " name " ********")) ! 325: (msg t "Definition:") ! 326: (msg t " Unique\#: " (getuniquenum def)) ! 327: (msg " Length: " (getstructlength def)) ! 328: (msg " DefaultInst: " (getdefaultinst def)) ! 329: (msg t " Isa: " (getisa def)) ! 330: (msg t " Pname: " (getpname def)) ! 331: (msg " HashAlias: " (gethashalias def)) ! 332: (msg " ExpansionList: " (getexpansionlist def)) ! 333: (msg t " BaseIfs: " (getbasehooks def)) ! 334: (msg t "Individual:") ! 335: (msg " Abbrev: " (getabbrev item)) ! 336: (msg t " AList: " (getalist item)) ! 337: (msg " AListcp: " (getalistcp item)) ! 338: (for slotnum 1 (getstructlength def) ! 339: (msg t t "***Slotnum " slotnum ! 340: " : " (getslotname slotnum def)) ! 341: (msg t "Formatinfo: " (getformatinfo slotnum def)) ! 342: (msg " HashInfo: " (gethashinfo slotnum def)) ! 343: (msg " Enforce: " (getenforce slotnum def)) ! 344: (msg " Type: " (getslottype slotnum def)) ! 345: (msg " PPSet: " (getppset slotnum def)) ! 346: (msg t "ValueType: " (getslotvaluetype slotnum item)) ! 347: (msg " Internal Value: " (getslotvalue slotnum item)) ! 348: (msg t "Value: " (getvalue slotnum item)) ! 349: (msg " Preds: " (getpred slotnum item)) ! 350: (msg " SlotIfs: " (getslothooks slotnum item))) ! 351: '*invisible*)) ! 352: ! 353: ! 354: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! 355: ; the print functions for use with the top level, msg, and the ! 356: ; trace, break, etc. packages. ! 357: ! 358: ; standard trace print should use allform after turning off tracing. ! 359: (de pearltraceprintfn (*traceval*) ! 360: ; Set the $tracemute flag to t so that tracing won't be done ! 361: ; inside allform. ! 362: (let ((\$tracemute t)) ! 363: (print (allform *traceval*)))) ! 364: ! 365: ; standard showstack print should use allform. ! 366: (de pearlshowstackprintfn (*showstackval*) ! 367: (print (allform *showstackval*))) ! 368: ! 369: ; standard break print should use allform. ! 370: (de pearlbreakprintfn (*breakval*) ! 371: (print (allform *breakval*))) ! 372: ! 373: ; standard fix print should use allform. ! 374: (de pearlfixprintfn (*fixval*) ! 375: (print (allform *fixval*))) ! 376: ! 377: ; msg should allform, unless *invisible*. ! 378: (de msgprintfn (*msgval*) ! 379: (or (eq '*invisible* *msgval*) ! 380: (patom (allform *msgval*)))) ! 381: ! 382: ; printing in a trace-break should allprint. ! 383: (de pearltracebreakprintfn (*printval*) ! 384: (allprint *printval* 3)) ! 385: ! 386: ; standard print should allprint. ! 387: (de pearlprintfn (*printval*) ! 388: (allprint *printval* 3)) ! 389: ! 390: ; standard dskin print should use allform unless an atom. ! 391: (de dskprintfn (*dskval*) ! 392: (cond ((atom *dskval*) (patom *dskval*)) ! 393: ( t (print (allform *dskval*))))) ! 394: ! 395: ! 396: ; vi: set lisp:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.