diff options
Diffstat (limited to 'src/interp/debug.lisp.pamphlet')
-rw-r--r-- | src/interp/debug.lisp.pamphlet | 1244 |
1 files changed, 0 insertions, 1244 deletions
diff --git a/src/interp/debug.lisp.pamphlet b/src/interp/debug.lisp.pamphlet deleted file mode 100644 index b4ceeed3..00000000 --- a/src/interp/debug.lisp.pamphlet +++ /dev/null @@ -1,1244 +0,0 @@ -%% Oh Emacs, this is a -*- Lisp -*- file despite apperance. -\documentclass{article} -\usepackage{axiom} - -\title{\File{src/interp/debug.lisp} Pamphlet} -\author{Timothy Daly} - -\begin{document} -\maketitle - -\begin{abstract} -\end{abstract} - -\tableofcontents -\eject - -\section{interrupt} - -A "resumable" break loop for use in trace etc. Unfortunately this -only works for CCL. We need to define a Common Lisp version. For -now the function is defined but does nothing. -<<interrupt>>= -#-:CCL -(defun interrupt (&rest ignore)) - -#+:CCL -(defun interrupt (&rest ignore) - (prog (prompt ifile ofile u v) - (setq ifile (rds *debug-io*)) - (setq ofile (wrs *debug-io*)) - (setq prompt (setpchar "Break loop (:? for help)> ")) -top (setq u (read)) - (cond - ((equal u ':x) (go exit)) - ((equal u ':r) (go resume)) - ((equal u ':q) - (progn (lisp::enable-backtrace nil) - (princ "Backtrace now disabled") - (terpri))) - ((equal u ':v) - (progn (lisp::enable-backtrace t) - (princ "Backtrace now enabled") - (terpri))) - ((equal u ':?) - (progn - (princ ":Q disables backtrace") - (terpri) - (princ ":V enables backtrace") - (terpri) - (princ ":R resumes from break") - (terpri) - (princ ":X exits from break loop") - (terpri) - (princ "else enter LISP expressions for evaluation") - (terpri))) - ((equal u #\eof) - (go exit)) - (t (progn - (setq v (errorset u nil nil)) - (if (listp v) (progn (princ "=> ") (prinl (car v)) (terpri))))) ) - (go top) -resume (rds ifile) - (wrs ofile) - (setpchar prompt) - (return nil) -exit (rds ifile) - (wrs ofile) - (setpchar prompt) - (lisp::unwind))) - -@ - -\section{License} - -<<license>>= -;; Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -;; All rights reserved. -;; -;; Redistribution and use in source and binary forms, with or without -;; modification, are permitted provided that the following conditions are -;; met: -;; -;; - Redistributions of source code must retain the above copyright -;; notice, this list of conditions and the following disclaimer. -;; -;; - Redistributions in binary form must reproduce the above copyright -;; notice, this list of conditions and the following disclaimer in -;; the documentation and/or other materials provided with the -;; distribution. -;; -;; - Neither the name of The Numerical ALgorithms Group Ltd. nor the -;; names of its contributors may be used to endorse or promote products -;; derived from this software without specific prior written permission. -;; -;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -@ -<<*>>= -<<license>> - -;;; @(#)debug.lisp 2.5 90/02/15 10:27:33 - -; NAME: Debugging Package -; PURPOSE: Debugging hooks for Boot code - -(in-package "BOOT") -(use-package '("LISP" )) - -(DEFPARAMETER /COUNTLIST NIL) -(DEFPARAMETER /TIMERLIST NIL) -(DEFPARAMETER /TRACESIZE NIL "sets limit on size of object to be mathprinted") -(DEFVAR CURSTRM *TERMINAL-IO*) -(DEFVAR /TRACELETNAMES ()) -(DEFVAR /PRETTY () "controls pretty printing of trace output") -(SETANDFILEQ /ECHO NIL) ;;"prevents echo of SPAD or BOOT code with /c" -(MAKEPROP 'LISP '/TERMCHR '(#\ #\()) -(MAKEPROP 'LSP '/TERMCHR '(#\ #\()) -(MAKEPROP 'META '/TERMCHR '(#\: #\()) -(MAKEPROP 'INPUT '/TERMCHR '(#\: #\< #\ #\()) -(MAKEPROP 'SPAD '/TERMCHR '(#\: #\< #\ #\()) -(MAKEPROP 'BOOT '/TERMCHR '(#\: #\< #\ #\()) -(MAKEPROP 'INPUT '/XCAPE #\_) -(MAKEPROP 'BOOT '/XCAPE '#\_) -(MAKEPROP 'SPAD '/XCAPE '#\_) -(MAKEPROP 'META '/READFUN 'META\,RULE) -(MAKEPROP 'INPUT '/READFUN '|New,LEXPR,Interactive|) -(MAKEPROP 'INPUT '/TRAN '/TRANSPAD) -(MAKEPROP 'BOOT '/READFUN '|New,LEXPR1|) -(MAKEPROP 'BOOT '/TRAN '/TRANSNBOOT) -(MAKEPROP 'SPAD '/READFUN '|New,LEXPR|) -(MAKEPROP 'SPAD '/TRAN '/TRANSPAD) - -(defmacro |/C,LIB| (&rest L &aux optionlist /editfile - ($prettyprint 't) ($reportCompilation 't)) - (declare (special optionlist /editfile $prettyprint $reportComilation)) - `',(|compileConstructorLib| L (/COMP) NIL NIL)) - -(defmacro /C (&rest L) `',(/D-1 L (/COMP) NIL NIL)) - -(defmacro /CT (&rest L) `',(/D-1 L (/COMP) NIL 'T)) - -(defmacro /CTL (&rest L) `',(/D-1 L (/COMP) NIL 'TRACELET)) - -(defmacro /D (&rest L) `',(/D-1 L 'DEFINE NIL NIL)) - -(defmacro /EC (&rest L) `', (/D-1 L (/COMP) 'T NIL)) - -(defmacro /ECT (&rest L) `',(/D-1 L (/COMP) 'T 'T)) - -(defmacro /ECTL (&rest L) `',(/D-1 L (/COMP) 'T 'TRACELET)) - -(defmacro /E (&rest L) `',(/D-1 L NIL 'T NIL)) - -(defmacro /ED (&rest L) `',(/D-1 L 'DEFINE 'T NIL)) - -(defun heapelapsed () 0) - -(defun /COMP () (if (fboundp 'COMP) 'COMP 'COMP370)) - -(DEFUN /D-1 (L OP EFLG TFLG) - (CATCH 'FILENAM - (PROG (TO OPTIONL OPTIONS FNL INFILE OUTSTREAM FN ) - (declare (special fn infile outstream )) - (if (member '? L :test #'eq) - (RETURN (OBEY "EXEC SPADEDIT /C TELL"))) - (SETQ OPTIONL (/OPTIONS L)) - (SETQ FNL (TRUNCLIST L OPTIONL)) - (SETQ OPTIONS (OPTIONS2UC OPTIONL)) - (SETQ INFILE (/MKINFILENAM (/GETOPTION OPTIONS 'FROM))) - (SETQ TO (/GETOPTION OPTIONS 'TO)) - (if TO (SETQ TO (/MKOUTFILENAM (/GETOPTION OPTIONS 'TO) INFILE))) - (SETQ OUTSTREAM (if TO (DEFSTREAM TO 'OUTPUT) CUROUTSTREAM)) - (RETURN (mapcar #'(lambda (fn) - (/D-2 FN INFILE OUTSTREAM OP EFLG TFLG)) - (or fnl (list /fn))))))) - -(DEFUN |/D,2,LIB| (FN INFILE CUROUTSTREAM OP EDITFLAG TRACEFLAG) - (declare (special CUROUTSTREAM)) - "Called from compConLib1 (see LISPLIB BOOT) to bind CUROUTSTREAM." - (/D-2 FN INFILE CUROUTSTREAM OP EDITFLAG TRACEFLAG)) - -(defparameter $linenumber 0) - -(DEFUN /D-2 (FN INFILE OUTPUTSTREAM OP EDITFLAG TRACEFLAG) - (declare (special OUTPUTSTREAM)) - (PROG (FT oft SFN X EDINFILE FILE DEF KEY RECNO U W SOURCEFILES - ECHOMETA SINGLINEMODE XCAPE XTOKENREADER INPUTSTREAM SPADERRORSTREAM - ISID NBLNK COMMENTCHR $TOKSTACK (/SOURCEFILES |$sourceFiles|) - METAKEYLST DEFINITION_NAME (|$sourceFileTypes| '(|spad| |boot| |lisp| |lsp| |meta|)) - ($FUNCTION FN) $BOOT $NEWSPAD $LINESTACK $LINENUMBER STACK STACKX BACK OK - TRAPFLAG |$InteractiveMode| TOK COUNT ERRCOL COLUMN *QUERY CHR LINE - (*COMP370-APPLY* (if (eq op 'define) #'eval-defun #'compile-defun))) - (declare (special ECHOMETA SINGLINEMODE XCAPE XTOKENREADER INPUTSTREAM - SPADERRORSTREAM ISID NBLNK COMMENTCHR $TOKSTACK /SOURCEFILES - METAKEYLST DEFINITION_NAME |$sourceFileTypes| - $FUNCTION $BOOT $NEWSPAD $LINESTACK $LINENUMBER STACK STACKX BACK OK - TRAPFLAG |$InteractiveMode| TOK COUNT ERRCOL COLUMN *QUERY CHR LINE)) - (if (PAIRP FN) (SETQ FN (QCAR FN))) - (SETQ INFILE (OR INFILE (|getFunctionSourceFile| FN))) - ;; $FUNCTION is freely set in getFunctionSourceFile - (IF (PAIRP $FUNCTION) (SETQ $FUNCTION (QCAR $FUNCTION))) - (SETQ FN $FUNCTION) - (SETQ /FN $FUNCTION) - LOOP (SETQ SOURCEFILES - (cond ( INFILE - (SETQ /SOURCEFILES (CONS INFILE (REMOVE INFILE /SOURCEFILES))) - (LIST INFILE)) - ( /EDITFILE - (|insert| (|pathname| /EDITFILE) /SOURCEFILES)) - ( 't /SOURCEFILES))) - (SETQ RECNO - (dolist (file sourcefiles) - (SETQ INPUTSTREAM (DEFSTREAM FILE 'INPUT)) - - ;;?(REMFLAG S-SPADKEY 'KEY) ; hack !! - (SETQ FT (|pathnameType| FILE)) - (SETQ oft (|object2Identifier| (UPCASE FT))) - (SETQ XCAPE (OR (GET oft '/XCAPE) #\|)) - (SETQ COMMENTCHR (GET oft '/COMMENTCHR)) - (SETQ XTOKENREADER (OR (GET oft '/NXTTOK) 'METATOK)) - (SETQ DEFINITION_NAME FN) - (SETQ KEY - (STRCONC - (OR (AND (EQ oFT 'SPAD) "") - (AND (EQ oFT 'BOOT) "") - (GET oFT '/PREFIX) - "") - (PNAME FN))) - (SETQ SFN (GET oFT '/READFUN)) - (SETQ RECNO (/LOCATE FN KEY FILE 0)) - (SHUT INPUTSTREAM) - (cond ((NUMBERP RECNO) - (SETQ /SOURCEFILES (CONS FILE (REMOVE FILE /SOURCEFILES))) - (SETQ INFILE FILE) - (RETURN RECNO)))) ) - (if (NOT RECNO) - (if (SETQ INFILE (/MKINFILENAM '(NIL))) (GO LOOP) (UNWIND))) - (TERPRI) - (TERPRI) - (SETQ INFILE (|pathname| INFILE)) - (COND - ( EDITFLAG - ;;%% next form is used because $FINDFILE seems to screw up - ;;%% sometimes. The stream is opened and closed several times - ;;%% in case the filemode has changed during editing. - (SETQ EDINFILE (make-input-filename INFILE)) - (SETQ INPUTSTREAM (DEFSTREAM EDINFILE 'INPUT)) - (|sayBrightly| - (LIST " editing file" '|%b| (|namestring| EDINFILE) '|%d|)) - (OBEY - (STRCONC - (make-absolute-filename "/lib/SPADEDFN ") - (|namestring| EDINFILE) - " " - (STRINGIMAGE $LINENUMBER))) - (SHUT INPUTSTREAM) - ;(COND - ; ( (EQ (READ ERRORINSTREAM) 'ABORTPROCESS) - ; (RETURN 'ABORT) ) ) - ;;%% next is done in case the diskmode changed - ;;(SETQ INFILE (|pathname| (IFCAR - ;; (QSORT ($LISTFILE INFILE))))) - (SETQ INPUTSTREAM (DEFSTREAM INFILE 'INPUT)) - (SETQ RECNO (/LOCATE FN KEY INFILE RECNO)) - - (COND ((NOT RECNO) - (|sayBrightly| (LIST " Warning: function" "%b" /FN "%d" - "was not found in the file" "%l" " " "%b" - (|namestring| INFILE) "%d" "after editing.")) - (RETURN NIL))) - ;; next is done in case the diskmode changed - (SHUT INPUTSTREAM) )) - ;;(SETQ INFILE (|pathname| (IFCAR ($LISTFILE INFILE)))) - (SETQ INFILE (make-input-filename INFILE)) - (MAKEPROP /FN 'DEFLOC - (CONS RECNO INFILE)) - (SETQ oft (|object2Identifier| (UPCASE (|pathnameType| INFILE)))) - (COND - ( (NULL OP) - (RETURN /FN) ) ) - (COND - ( (EQ TRACEFLAG 'TRACELET) - (RETURN (/TRACELET-1 (LIST FN) NIL)) ) ) - (SETQ INPUTSTREAM (DEFSTREAM INFILE 'INPUT)) - (|sayBrightly| - (LIST " Reading file" '|%b| (|namestring| INFILE) '|%d|)) - (TERPRI) - (SETQ $BOOT (EQ oft 'BOOT)) - (SETQ $NEWSPAD (OR $BOOT (EQ oft 'SPAD))) - (SETQ DEF - (COND - ( SFN - ;(+VOL 'METABASE) - (POINT RECNO INPUTSTREAM) - ;(SETQ CHR (CAR INPUTSTREAM)) - ;(SETQ ERRCOL 0) - ;(SETQ COUNT 0) - ;(SETQ COLUMN 0) - ;(SETQ TRAPFLAG NIL) - (SETQ OK 'T) - ;(NXTTOK) - ;(SETQ LINE (CURINPUTLINE)) - ;(SETQ SPADERRORSTREAM CUROUTSTREAM) - ;(AND /ECHO (SETQ ECHOMETA 'T) (PRINTEXP LINE) (TERPRI)) - ;(SFN) - (SETQ DEF (BOOT-PARSE-1 INPUTSTREAM)) - (SETQ DEBUGMODE 'YES) - (COND - ( (NULL OK) - (FUNCALL (GET oft 'SYNTAX_ERROR)) - NIL ) - ( 'T - DEF ) ) ) - ( 'T - (let* ((mode-line (read-line inputstream)) - (pacpos (search "package:" mode-line :test #'equalp)) - (endpos (search "-*-" mode-line :from-end t)) - (*package* *package*) - (newpac nil)) - (when pacpos - (setq newpac (read-from-string mode-line nil nil - :start (+ pacpos 8) - :end endpos)) - (setq *package* - (cond ((find-package newpac)) - (t *package*)))) - (POINT RECNO INPUTSTREAM) - (READ INPUTSTREAM))))) - #+Lucid(system::compiler-options :messages t :warnings t) - (COND - ( (SETQ U (GET oft '/TRAN)) - (SETQ DEF (FUNCALL U DEF)) ) ) - (/WRITEUPDATE - /FN - (|pathnameName| INFILE) - (|pathnameType| INFILE) - (OR (|pathnameDirectory| INFILE) '*) - (OR (KAR (KAR (KDR DEF))) NIL) - OP) - (COND - ( (OR /ECHO $PRETTYPRINT) - (PRETTYPRINT DEF OUTPUTSTREAM) ) ) - (COND - ( (EQ oft 'LISP) - (if (EQ OP 'DEFINE) (EVAL DEF) - (compile (EVAL DEF)))) - ( DEF - (FUNCALL OP (LIST DEF)) ) ) - #+Lucid(system::compiler-options :messages nil :warnings nil) - #+Lucid(TERPRI) - (COND - ( TRACEFLAG - (/TRACE-2 /FN NIL) ) ) - (SHUT INPUTSTREAM) - (RETURN (LIST /FN)) ) ) - -(DEFUN FUNLOC (func &aux file) - (if (PAIRP func) (SETQ func (CAR func))) - (setq file (ifcar (findtag func))) - (if file (list (pathname-name file) (pathname-type file) func) - nil)) - -(DEFUN /LOCATE (FN KEY INFILE INITRECNO) - (PROG (FT RECNO KEYLENGTH LN) - (if (AND (NOT (eq 'FROMWRITEUPDATE (|pathnameName| INFILE))) - (NOT (make-input-filename INFILE))) - (RETURN NIL)) - (SETQ FT (UPCASE (|object2Identifier| (|pathnameType| INFILE)))) - (SETQ KEYLENGTH (STRINGLENGTH KEY)) - (WHEN (> INITRECNO 1) ;; we think we know where it is - (POINT INITRECNO INPUTSTREAM) - (SETQ LN (READ-LINE INPUTSTREAM NIL NIL)) - (IF (AND LN (MATCH-FUNCTION-DEF FN KEY KEYLENGTH LN FT)) - (RETURN INITRECNO))) - (SETQ $LINENUMBER 0) - (POINT 0 INPUTSTREAM) -EXAMINE (SETQ RECNO (NOTE INPUTSTREAM)) - (SETQ LN (READ-LINE INPUTSTREAM NIL NIL)) - (INCF $LINENUMBER) - (if (NULL LN) (RETURN NIL)) - (IF (MATCH-FUNCTION-DEF FN KEY KEYLENGTH LN FT) - (RETURN RECNO)) - (GO EXAMINE))) - -(DEFUN MATCH-FUNCTION-DEF (fn key keylength line type) - (if (eq type 'LISP) (match-lisp-tag fn line "(def") - (let ((n (mismatch key line))) - (and (= n keylength) - (or (= n (length line)) - (member (elt line n) - (or (get type '/termchr) '(#\space )))))))) - -(define-function '|/D,1| #'/D-1) - -(DEFUN /INITUPDATES (/VERSION) - (SETQ FILENAME (STRINGIMAGE /VERSION)) - (SETQ /UPDATESTREAM (open (strconc "/tmp/update." FILENAME) :direction :output - :if-exists :append :if-does-not-exist :create)) - (PRINTEXP - " Function Name Filename Date Time" - /UPDATESTREAM) - (TERPRI /UPDATESTREAM) - (PRINTEXP - " --------------------------- ----------------------- -------- -----" - /UPDATESTREAM) - (TERPRI /UPDATESTREAM) ) - -(defun /UPDATE (&rest ARGS) - (LET (( FILENAME (OR (KAR ARGS) - (strconc "/tmp/update." (STRINGIMAGE /VERSION)))) - (|$createUpdateFiles| NIL)) - (DECLARE (SPECIAL |$createUpdateFiles|)) - (CATCH 'FILENAM (/UPDATE-1 FILENAME '(/COMP))) - (SAY "Update is finished"))) - -(defun /DUPDATE (&rest ARGS) - (LET (( FILENAME (OR (KAR ARGS) - (strconc "/tmp/update." (STRINGIMAGE /VERSION)))) - (|$createUpdateFiles| NIL)) - (DECLARE (SPECIAL |$createUpdateFiles|)) - (CATCH 'FILENAM (/UPDATE-1 FILENAME 'DEFINE)) - (SAY "Update is finished"))) - -(DEFUN /UPDATE-1 (UPFILE OP) - ;;if /VERSION=0 then no new update files will be written. - (prog (STREAM RECORD FUN FILE FUNFILES) - (SETQ STREAM (DEFSTREAM (/MKINFILENAM UPFILE) 'INPUT)) - LOOP - (if (STREAM-EOF STREAM) (RETURN NIL)) - (SETQ RECORD (read-line STREAM)) - (if (NOT (STRINGP RECORD)) (RETURN NIL)) - (if (< (LENGTH RECORD) 36) (GO LOOP)) - (SETQ FUN (STRING2ID-N (SUBSTRING RECORD 0 36) 1)) - (if (AND (NOT (EQUAL FUN 'QUAD)) (EQUAL (SUBSTRING RECORD 0 1) " ")) - (GO LOOP)) - (SETQ FILE (STRING2ID-N RECORD 2)) - (if (member (cons fun file) funfiles :test #'equal) (go loop)) - (push (cons fun file) funfiles) - (COND ((EQUAL FUN 'QUAD) (/RF-1 FILE)) - ((/D-2 FUN FILE CUROUTSTREAM OP NIL NIL))) - (GO LOOP))) - -(DEFUN /WRITEUPDATE (FUN FN FT FM FTYPE OP) - -;;;If /VERSION=0 then no save has yet been done. -;;;If A disk is not read-write, then issue msg and return. -;;;If /UPDATESTREAM not set or current /UPDATES file doesnt exist, initialize. - - (PROG (IFT KEY RECNO ORECNO COUNT DATE TIME) -; (if (EQ 0 /VERSION) (RETURN NIL)) - (if (EQ 'INPUT FT) (RETURN NIL)) - (if (NOT |$createUpdateFiles|) (RETURN NIL)) -; (COND ((/= 0 (directory "A"))) -; ((SAY "A disk is not read-write. Update file not modified") -; (RETURN NIL))) - (if (OR (NOT (BOUNDP '/UPDATESTREAM)) - (NOT (STREAMP /UPDATESTREAM))) - (/INITUPDATES /VERSION)) -; (SETQ IFT (INTERN (STRINGIMAGE /VERSION))) -; (SETQ INPUTSTREAM (open (strconc IFT /WSNAME) :direction :input)) -; (NEXT INPUTSTREAM) -; (SETQ KEY (if (NOT FUN) -; (STRCONC " QUAD " -; (PNAME FN)) -; (PNAME FUN))) -; (SETQ RECNO (/LOCATE KEY (LIST 'FROMWRITEUPDATE /WSNAME) 1)) -; (SETQ COUNT (COND -; ((NOT (NUMBERP RECNO)) 1) -; ((POINT RECNO INPUTSTREAM) -; (do ((i 1 (1+ i))) ((> i 4)) (read inputstream)) -; (1+ (READ INPUTSTREAM)) ))) -; (COND ((NUMBERP RECNO) -; (SETQ ORECNO (NOTE /UPDATESTREAM)) -; (POINTW RECNO /UPDATESTREAM) )) - (SETQ DATETIME (|getDateAndTime|)) - (SETQ DATE (CAR DATETIME)) - (SETQ TIME (CDR DATETIME)) - (PRINTEXP (STRCONC - (COND ((NOT FUN) " QUAD ") - ((STRINGPAD (PNAME FUN) 28))) " " - (STRINGIMAGE FM) - (STRINGIMAGE FN) "." (STRINGIMAGE FT) - " " - DATE " " TIME) /UPDATESTREAM) - (TERPRI /UPDATESTREAM) -; (if (NUMBERP RECNO) (POINTW ORECNO /UPDATESTREAM)) - )) - -(defun |getDateAndTime| () - (MULTIPLE-VALUE-BIND (sec min hour day mon year) (get-decoded-time) - (CONS (STRCONC (LENGTH2STR mon) "/" - (LENGTH2STR day) "/" - (LENGTH2STR year) ) - (STRCONC (LENGTH2STR hour) ":" - (LENGTH2STR min))))) - -(DEFUN LENGTH2STR (X &aux XLEN) - (cond ( (= 1 (SETQ XLEN (LENGTH (SETQ X (STRINGIMAGE X))))) (STRCONC "0" X)) - ( (= 2 XLEN) X) - ( (subseq x (- XLEN 2))))) - -(defmacro /T (&rest L) (CONS '/TRACE (OR L (LIST /FN)))) - -(defmacro /TRACE (&rest L) `',(/TRACE-0 L)) - -(DEFUN /TRACE-0 (L) - (if (member '? L :test #'eq) - (OBEY "EXEC NORMEDIT TRACE TELL") - (let* ((options (/OPTIONS L)) (FNL (TRUNCLIST L OPTIONS))) - (/TRACE-1 FNL OPTIONS)))) - -(define-function '|/TRACE,0| #'/TRACE-0) - -(defmacro /TRACEANDCOUNT (&rest L) `', - (let* ((OPTIONS (/OPTIONS L)) - (FNL (TRUNCLIST L OPTIONS))) - (/TRACE-1 FNL (CONS '(DEPTH) OPTIONS)))) - -(DEFUN /TRACE-1 (FNLIST OPTIONS) - (mapcar #'(lambda (X) (/TRACE-2 X OPTIONS)) FNLIST) - (/TRACEREPLY)) - -(defvar |$traceDomains| t) - -(DEFUN /TRACE-2 (FN OPTIONS) - (PROG (U FNVAL COUNTNAM TRACECODE BEFORE AFTER CONDITION - TRACENAME CALLER VARS BREAK FROM_CONDITION VARBREAK TIMERNAM - ONLYS G WITHIN_CONDITION DEPTH_CONDITION COUNT_CONDITION - LETFUNCODE MATHTRACE ) - (if (member FN /TRACENAMES :test #'eq) (/UNTRACE-2 FN NIL)) - (SETQ OPTIONS (OPTIONS2UC OPTIONS)) - (if (AND |$traceDomains| (|isFunctor| FN) (ATOM FN)) - (RETURN (|traceDomainConstructor| FN OPTIONS))) - (SETQ MATHTRACE (/GETTRACEOPTIONS OPTIONS 'MATHPRINT)) - (if (AND MATHTRACE (NOT (EQL (ELT (PNAME FN) 0) #\$)) (NOT (GENSYMP FN))) - (if (RASSOC FN |$mapSubNameAlist|) - (SETQ |$mathTraceList| (CONS FN |$mathTraceList|)) - (|spadThrowBrightly| - (format nil "mathprint not available for ~A" FN)))) - (SETQ VARS (/GETTRACEOPTIONS OPTIONS 'VARS)) - (if VARS - (progn (if (NOT (CDR VARS)) (SETQ VARS 'all) (SETQ VARS (CDR VARS))) - (|tracelet| FN VARS))) - (SETQ BREAK (/GETTRACEOPTIONS OPTIONS 'BREAK)) - (SETQ VARBREAK (/GETTRACEOPTIONS OPTIONS 'VARBREAK)) - (if VARBREAK - (progn (if (NOT (CDR VARBREAK)) (SETQ VARS 'all) - (SETQ VARS (CDR VARBREAK))) - (|breaklet| FN VARS))) - (if (and (symbolp fn) (not (boundp FN)) (not (fboundp FN))) - (progn - (COND ((|isUncompiledMap| FN) - (|sayBrightly| - (format nil - "~A must be compiled before it may be traced -- invoke ~A to compile" - FN FN))) - ((|isInterpOnlyMap| FN) - (|sayBrightly| (format nil - "~A cannot be traced because it is an interpret-only function" FN))) - (T (|sayBrightly| (format nil "~A is not a function" FN)))) - (RETURN NIL))) - (if (and (symbolp fn) (boundp FN) - (|isDomainOrPackage| (SETQ FNVAL (EVAL FN)))) - (RETURN (|spadTrace| FNVAL OPTIONS))) - (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'MASK=)) - (MAKEPROP FN '/TRANSFORM (CADR U))) - (SETQ /TRACENAMES - (COND ((/GETTRACEOPTIONS OPTIONS 'ALIAS) /TRACENAMES) - ((ATOM /TRACENAMES) (LIST FN)) - ((CONS FN /TRACENAMES)))) - (SETQ TRACENAME - (COND ((SETQ U (/GETTRACEOPTIONS OPTIONS 'ALIAS)) - (STRINGIMAGE (CADR U))) - (T - (COND ((AND |$traceNoisely| (NOT VARS) - (NOT (|isSubForRedundantMapName| FN))) - (|sayBrightly| - (LIST '|%b| (|rassocSub| FN |$mapSubNameAlist|) - '|%d| "traced")))) - (STRINGIMAGE FN)))) - (COND (|$fromSpadTrace| - (if MATHTRACE (push (INTERN TRACENAME) |$mathTraceList|)) - (SETQ LETFUNCODE `(SETQ |$currentFunction| ,(MKQ FN))) - (SETQ BEFORE - (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'BEFORE)) - `(progn ,(CADR U) ,LETFUNCODE) - LETFUNCODE))) - (T (SETQ BEFORE - (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'BEFORE)) - (CADR U))))) - (SETQ AFTER (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'AFTER)) (CADR U))) - (SETQ CALLER (/GETTRACEOPTIONS OPTIONS 'CALLER)) - (SETQ FROM_CONDITION - (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'FROM)) - (LIST 'EQ '|#9| (LIST 'QUOTE (CADR U))) - T)) - (SETQ CONDITION - (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'WHEN)) (CADR U) T)) - (SETQ WITHIN_CONDITION T) - (COND ((SETQ U (/GETTRACEOPTIONS OPTIONS 'WITHIN)) - (SETQ G (INTERN (STRCONC (PNAME FN) "/" (PNAME (CADR U))))) - (SET G 0) - (/TRACE-1 - (LIST (CADR U)) - `((WHEN NIL) - (BEFORE (SETQ ,G (1+ ,G))) - (AFTER (SETQ ,G (1- ,G))))) - (SETQ WITHIN_CONDITION `(> ,G 0)))) - (SETQ COUNTNAM - (AND (/GETTRACEOPTIONS OPTIONS 'COUNT) - (INTERN (STRCONC TRACENAME ",COUNT"))) ) - (SETQ COUNT_CONDITION - (COND ((SETQ U (/GETTRACEOPTIONS OPTIONS 'COUNT)) - (SETQ /COUNTLIST (adjoin TRACENAME /COUNTLIST - :test 'equal)) - (if (AND (CDR U) (integerp (CADR U))) - `(cond ((<= ,COUNTNAM ,(CADR U)) t) - (t (/UNTRACE-2 ,(MKQ FN) NIL) NIL)) - t)) - (T T))) - (AND (/GETTRACEOPTIONS OPTIONS 'TIMER) - (SETQ TIMERNAM (INTERN (STRCONC TRACENAME ",TIMER"))) - (SETQ /TIMERLIST (adjoin TRACENAME /TIMERLIST :test 'equal))) - (SETQ DEPTH_CONDITION - (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'DEPTH)) - (if (AND (CDR U) (integerp (CADR U))) - (LIST 'LE 'FUNDEPTH (CADR U)) - (TRACE_OPTION_ERROR 'DEPTH)) - T)) - (SETQ CONDITION - (MKPF - (LIST CONDITION WITHIN_CONDITION FROM_CONDITION COUNT_CONDITION - DEPTH_CONDITION ) - 'AND)) - (SETQ ONLYS (/GETTRACEOPTIONS OPTIONS 'ONLY)) - - ;TRACECODE meaning: - ; 0: Caller (0,1) print caller if 1 - ; 1: Value (0,1) print value if 1 - ; 2...: Arguments (0,...,9) stop if 0; print ith if i; all if 9 - (SETQ TRACECODE - (if (/GETTRACEOPTIONS OPTIONS 'NT) "000" - (PROG (F A V C NL BUF) - (SETQ ONLYS (MAPCAR #'COND-UCASE ONLYS)) - (SETQ F (OR (member 'F ONLYS :test #'eq) - (member 'FULL ONLYS :test #'eq))) - (SETQ A (OR F (member 'A ONLYS :test #'eq) - (member 'ARGS ONLYS :test #'eq))) - (SETQ V (OR F (member 'V ONLYS :test #'eq) - (member 'VALUE ONLYS :test #'eq))) - (SETQ C (OR F (member 'C ONLYS :test #'eq) - (member 'CALLER ONLYS :test #'eq))) - (SETQ NL - (if A '(#\9) - (mapcan #'(lambda (X) - (if (AND (INTEGERP X) - (> X 0) - (< X 9)) - (LIST (FETCHCHAR (STRINGIMAGE X) 0)))) - onlys))) - (if (NOT (OR A V C NL)) - (if Caller (return "119") (return "019"))) - (SETQ NL (APPEND NL '(\0))) - (SETQ BUF (GETSTR 12)) - (SUFFIX (if (or C Caller) #\1 #\0) BUF) - (SUFFIX (if V #\1 #\0) BUF) - (if A (suffix #\9 BUF) - (mapcar #'(lambda (x) (suffix x BUF)) NL)) - (RETURN BUF)))) - (/MONITOR FN TRACECODE BEFORE AFTER CONDITION TIMERNAM - COUNTNAM TRACENAME BREAK ))) - -(DEFUN OPTIONS2UC (L) - (COND ((NOT L) NIL) - ((ATOM (CAR L)) - (|spadThrowBrightly| - (format nil "~A has wrong format for an option" (car L)))) - ((CONS (CONS (LC2UC (CAAR L)) (CDAR L)) (OPTIONS2UC (CDR L)))))) - -(DEFUN COND-UCASE (X) (COND ((INTEGERP X) X) ((UPCASE X)))) - -(DEFUN TRACEOPTIONS (X) - (COND ((NOT X) NIL) - ((EQ (CAR X) '/) X) - ((TRACEOPTIONS (CDR X))))) - -(defmacro |/untrace| (&rest L) `', (/UNTRACE-0 L)) - -(defmacro /UNTRACE (&rest L) `', (/UNTRACE-0 L)) - -(defmacro /U (&rest L) `', (/UNTRACE-0 L)) - -(DEFUN /UNTRACE-0 (L) - (PROG (OPTIONL OPTIONS FNL) - (if (member '? L :test #'eq) (RETURN (OBEY "EXEC NORMEDIT TRACE TELL"))) - (SETQ OPTIONL (/OPTIONS L)) - (SETQ FNL (TRUNCLIST L OPTIONL)) - (SETQ OPTIONS (if OPTIONL (CAR OPTIONL))) - (RETURN (/UNTRACE-1 FNL OPTIONS)))) - -(define-function '|/UNTRACE,0| #'/UNTRACE-0) - -(defun /UNTRACE-1 (L OPTIONS) - (cond - ((NOT L) - (if (ATOM /TRACENAMES) - NIL - (mapcar #'(lambda (u) (/UNTRACE-2 (/UNTRACE-REDUCE U) OPTIONS)) - (APPEND /TRACENAMES NIL)))) - ((mapcar #'(lambda (x) (/UNTRACE-2 X OPTIONS)) L))) - (/TRACEREPLY)) - -(DEFUN /UNTRACE-REDUCE (X) (if (ATOM X) X (first X))) ; (CAR X) is now a domain - -(DEFUN /UNTRACE-2 (X OPTIONS) - (let (u y) - (COND ((AND (|isFunctor| X) (ATOM X)) - (|untraceDomainConstructor| X)) - ((OR (|isDomainOrPackage| (SETQ U X)) - (and (symbolp X) (boundp X) - (|isDomain| (SETQ U (EVAL X))))) - (|spadUntrace| U OPTIONS)) - ((EQCAR OPTIONS 'ALIAS) - (if |$traceNoisely| - (|sayBrightly| (LIST '|%b| (CADR OPTIONS) '|%d| '**untraced))) - (SETQ /TIMERLIST - (REMOVE (STRINGIMAGE (CADR OPTIONS)) /TIMERLIST :test 'equal)) - (SETQ /COUNTLIST - (REMOVE (STRINGIMAGE (CADR OPTIONS)) /COUNTLIST :test 'equal)) - (SETQ |$mathTraceList| - (REMOVE (CADR OPTIONS) |$mathTraceList| :test 'equal)) - (UNEMBED X)) - ((AND (NOT (MEMBER X /TRACENAMES)) - (NOT (|isSubForRedundantMapName| X))) - (|sayBrightly| - (LIST - '|%b| - (|rassocSub| X |$mapSubNameAlist|) - '|%d| - "not traced"))) - (T (SETQ /TRACENAMES (REMOVE X /TRACENAMES :test 'equal)) - (SETQ |$mathTraceList| - (REMOVE (if (STRINGP X) (INTERN X) X) |$mathTraceList|)) - (SETQ |$letAssoc| (DELASC X |$letAssoc|)) - (setq Y (if (IS_GENVAR X) (|devaluate| (EVAL X)) X)) - (SETQ /TIMERLIST (REMOVE (STRINGIMAGE Y) /TIMERLIST :test 'equal)) - (SET (INTERN (STRCONC Y ",TIMER")) 0) - (SETQ /COUNTLIST (REMOVE (STRINGIMAGE Y) /COUNTLIST :test 'equal)) - (SET (INTERN (STRCONC Y ",COUNT")) 0) - (COND ((AND |$traceNoisely| (NOT (|isSubForRedundantMapName| Y))) - (|sayBrightly| - (LIST '|%b| (|rassocSub| Y |$mapSubNameAlist|) - '|%d| "untraced")))) - (UNEMBED X))))) - - ;; the following is called by |clearCache| -(define-function '/UNTRACE\,2 #'/UNTRACE-2) - -(DEFUN MONITOR-PRINVALUE (VAL NAME) - (let (u) - (COND ((setq U (GET NAME '/TRANSFORM)) - (COND - ((EQCAR U '&) - (PRINC "//" CURSTRM) (PRIN1 VAL CURSTRM) (TERPRI CURSTRM)) - (T (PRINC "! " CURSTRM) - (PRIN1 (EVAL (SUBST (MKQ VAL) '* (CAR U))) CURSTRM) - (TERPRI CURSTRM)) )) - (T - (PRINC ": " CURSTRM) - (COND ((NOT (SMALL-ENOUGH VAL)) (|F,PRINT-ONE| VAL CURSTRM)) - (/PRETTY (PRETTYPRINT VAL CURSTRM)) - (T (COND (|$mathTrace| (TERPRI))) - (PRINMATHOR0 VAL CURSTRM))))))) - -(DEFUN MONITOR-BLANKS (N) (PRINC (MAKE-FULL-CVEC N " ") CURSTRM)) - -(DEFUN MONITOR-EVALBEFORE (X) (EVALFUN (MONITOR-EVALTRAN X NIL)) X) - -(DEFUN MONITOR-EVALAFTER (X) (EVALFUN (MONITOR-EVALTRAN X 'T))) - -(DEFUN MONITOR-EVALTRAN (X FG) - (if (HAS_SHARP_VAR X) (MONITOR-EVALTRAN1 X FG) X)) - -(define-function 'MONITOR\,EVALTRAN #'MONITOR-EVALTRAN) - -(DEFUN MONITOR-EVALTRAN1 (X FG) - (let (n) - (COND - ((SETQ N (|isSharpVarWithNum| X)) (MONITOR-GETVALUE N FG)) - ((ATOM X) X) - ((CONS (MONITOR-EVALTRAN1 (CAR X) FG) - (MONITOR-EVALTRAN1 (CDR X) FG)))))) - -(DEFUN HAS_SHARP_VAR (X) - (COND ((AND (ATOM X) (IS_SHARP_VAR X)) 'T) - ((ATOM X) NIL) - ((OR (HAS_SHARP_VAR (CAR X)) (HAS_SHARP_VAR (CDR X)))))) - -(DEFUN IS_SHARP_VAR (X) - (AND (IDENTP X) - (EQL (ELT (PNAME X) 0) #\#) - (INTEGERP (lisp:parse-integer (symbol-name X) :start 1)))) - -(DEFUN MONITOR-GETVALUE (N FG) - (COND ((= N 0) - (if FG - (MKQ /VALUE) - (|spadThrowBrightly| "cannot ask for value before execution"))) - ((= N 9) (MKQ /CALLER)) - ((<= N (SIZE /ARGS)) (MKQ (ELT /ARGS (1- N)))) - ((|spadThrowBrightly| (LIST 'function '|%b| /NAME '|%d| - "does not have" '|%b| N '|%d| "arguments"))))) - -(DEFUN MONITOR-PRINARGS (L CODE /TRANSFORM) - (let (N) - (cond - ((= (digit-char-p (elt CODE 2)) 0) NIL) - ((= (digit-char-p (elt CODE 2)) 9) - (cond - (/TRANSFORM - (mapcar - #'(lambda (x y) - (COND ((EQ Y '*) - (PRINC "\\ " CURSTRM) - (MONITOR-PRINT X CURSTRM)) - ((EQ Y '&) - (PRINC "\\\\" CURSTRM) - (TERPRI CURSTRM) - (PRINT X CURSTRM)) - ((NOT Y) (PRINC "! " CURSTRM)) - (T - (PRINC "! " CURSTRM) - (MONITOR-PRINT - (EVAL (SUBST (MKQ X) '* Y)) CURSTRM)))) - L (cdr /transform))) - (T (PRINC ": " CURSTRM) - (COND ((NOT (ATOM L)) - (if |$mathTrace| (TERPRI CURSTRM)) - (MONITOR-PRINT (CAR L) CURSTRM) (SETQ L (CDR L)))) - (mapcar #'monitor-printrest L)))) - ((do ((istep 2 (+ istep 1)) - (k (maxindex code))) - ((> istep k) nil) - (when (not (= 0 (SETQ N (digit-char-p (elt CODE ISTEP))))) - (PRINC "\\" CURSTRM) - (PRINMATHOR0 N CURSTRM) - (PRINC ": " CURSTRM) - (MONITOR-PRINARGS-1 L N))))))) - -(DEFUN MONITOR-PRINTREST (X) - (COND ((NOT (SMALL-ENOUGH X)) - (PROGN (TERPRI) - (MONITOR-BLANKS (1+ /DEPTH)) - (PRINC "\\" CURSTRM) - (PRINT X CURSTRM))) - ((PROGN (if (NOT |$mathTrace|) (PRINC "\\" CURSTRM)) - (COND (/PRETTY (PRETTYPRINT X CURSTRM)) - ((PRINMATHOR0 X CURSTRM))))))) - -(DEFUN MONITOR-PRINARGS-1 (L N) - (COND ((OR (ATOM L) (LESSP N 1)) NIL) - ((EQ N 1) (MONITOR-PRINT (CAR L) CURSTRM)) - ((MONITOR-PRINARGS-1 (CDR L) (1- N))))) - -(DEFUN MONITOR-PRINT (X CURSTRM) - (COND ((NOT (SMALL-ENOUGH X)) (|F,PRINT-ONE| X CURSTRM)) - (/PRETTY (PRETTYPRINT X CURSTRM)) - ((PRINMATHOR0 X CURSTRM)))) - -(DEFUN PRINMATHOR0 (X CURSTRM) - (if |$mathTrace| (|maprinSpecial| (|outputTran| X) /DEPTH 80) - (PRIN0 X CURSTRM))) - -(DEFUN SMALL-ENOUGH (X) (if /TRACESIZE (SMALL-ENOUGH-COUNT X 0 /TRACESIZE) t)) - -(DEFUN SMALL-ENOUGH-COUNT (X N M) - "Returns number if number of nodes < M otherwise nil." - (COND ((< M N) NIL) - ((VECP X) - (do ((i 0 (1+ i)) (k (maxindex x))) - ((> i k) n) - (if (NOT (SETQ N (SMALL-ENOUGH-COUNT (ELT X I) (1+ N) M))) - (RETURN NIL)))) - ((ATOM X) N) - ((AND (SETQ N (SMALL-ENOUGH-COUNT (CAR X) (1+ N) M)) - (SMALL-ENOUGH-COUNT (CDR X) N M))))) - -(DEFUN /OPTIONS (X) - (COND ((ATOM X) NIL) - ((OR (ATOM (CAR X)) (|isFunctor| (CAAR X))) (/OPTIONS (CDR X))) - (X))) - -(DEFUN /GETOPTION (L OPT) (KDR (/GETTRACEOPTIONS L OPT))) - -(DEFUN /GETTRACEOPTIONS (L OPT) - (COND ((ATOM L) NIL) - ((EQ (KAR (CAR L)) OPT) (CAR L)) - ((/GETTRACEOPTIONS (CDR L) OPT)))) - -(DEFMACRO /TRACELET (&rest L) `', - (PROG (OPTIONL FNL) - (if (member '? L :test #'eq) - (RETURN (OBEY (if (EQ (SYSID) 1) - "EXEC NORMEDIT TRACELET TELL" - "$COPY AZ8F:TRLET.TELL")) )) - (SETQ OPTIONL (/OPTIONS L)) - (SETQ FNL (TRUNCLIST L OPTIONL)) - (RETURN (/TRACELET-1 FNL OPTIONL)))) - -(DEFUN /TRACELET-1 (FNLIST OPTIONL) - (mapcar #'(lambda (x) (/tracelet-2 x optionl)) fnlist) - (/TRACE-1 FNLIST OPTIONL) - (TRACELETREPLY)) - -(DEFUN TRACELETREPLY () - (if (ATOM /TRACELETNAMES) '(none tracelet) - (APPEND /TRACELETNAMES (LIST 'tracelet)))) - -(DEFUN /TRACELET-2 (FN OPTIONL &AUX ($TRACELETFLAG T)) - (/D-1 (CONS FN OPTIONL) 'COMP NIL NIL) - (SETQ /TRACELETNAMES - (if (ATOM /TRACELETNAMES) (LIST FN) (CONS FN /TRACELETNAMES))) - FN) - -(defmacro /TRACE-LET (A B) - `(PROG1 (SPADLET ,A ,B) - . ,(mapcar #'(lambda (x) `(/tracelet-print ',x ,x)) - (if (ATOM A) (LIST A) A)))) - -(defun /TRACELET-PRINT (X Y &AUX (/PRETTY 'T)) - (PRINC (STRCONC (PNAME X) ": ") *terminal-io*) - (MONITOR-PRINT Y *terminal-io*)) - -(defmacro /UNTRACELET (&rest L) `', - (COND - ((NOT L) - (if (ATOM /TRACELETNAMES) NIL (EVAL (CONS '/UNTRACELET /TRACELETNAMES)))) - ((mapcar #'/untracelet-1 L)) - ((TRACELETREPLY)))) - -(DEFUN /UNTRACELET-1 (X) - (COND - ((NOT (MEMBER X /TRACELETNAMES)) - (PROGN (PRINT (STRCONC (PNAME X) " not tracelet")) (TERPRI))) - ((PROGN - (/UNTRACELET-2 X) - (/D-1 (LIST X) 'COMP NIL NIL))))) - -(DEFUN /UNTRACELET-2 (X) - (SETQ /TRACELETNAMES (REMOVE X /TRACELETNAMES)) - (PRINT (STRCONC (PNAME X) " untracelet")) (TERPRI)) - -(defmacro /EMBED (&rest L) `', - (COND ((NOT L) (/EMBEDREPLY)) - ((member '? L :test #'eq) (OBEY "EXEC NORMEDIT EMBED TELL")) - ((EQ 2 (LENGTH L)) (/EMBED-1 (CAR L) (CADR L))) - ((MOAN "IMPROPER USE OF /EMBED")))) - -(defmacro /UNEMBED (&rest L) `', - (COND ((NOT L) - (if (ATOM (EMBEDDED)) NIL - (mapcar #'unembed (embedded))) - (SETQ /TRACENAMES NIL) - (SETQ /EMBEDNAMES NIL)) - ((mapcar #'/unembed-1 L) - (SETQ /TRACENAMES (S- /TRACENAMES L)) )) - (/EMBEDREPLY)) - -(defun /UNEMBED-Q (X) - (COND - ((NOT (MEMBER X /EMBEDNAMES)) - (ERROR (STRCONC (PNAME X) " not embeded"))) - ((PROGN - (SETQ /EMBEDNAMES (REMOVE X /EMBEDNAMES)) - (UNEMBED X))))) - -(defun /UNEMBED-1 (X) - (COND - ((NOT (MEMBER X /EMBEDNAMES)) - (|sayBrightly| (LIST '|%b| (PNAME X) '|%d| "not embeded" '|%l|))) - ((PROGN - (SETQ /EMBEDNAMES (REMOVE X /EMBEDNAMES)) - (|sayBrightly| (LIST '|%b| (PNAME X) '|%d| "unembeded" '|%l|)) - (UNEMBED X))) )) - - - -(defun /MONITOR (&rest G5) - (PROG (G1 G4 TRACECODE BEFORE AFTER CONDITION - TIMERNAM COUNTNAM TRACENAME BREAK) - (dcq (G1 TRACECODE BEFORE AFTER CONDITION TIMERNAM COUNTNAM TRACENAME BREAK) G5) - (SETQ G4 (macro-function G1)) - (SETQ TRACECODE (OR TRACECODE "119")) - (if COUNTNAM (SET COUNTNAM 0)) - (if TIMERNAM (SET TIMERNAM 0)) - (EMBED - G1 - (LIST - (if G4 'MLAMBDA 'LAMBDA) - '(&rest G6) - (LIST - '/MONITORX - (QUOTE G6) - G1 - (LIST - 'QUOTE - (LIST - TRACENAME (if G4 'MACRO) TRACECODE - COUNTNAM TIMERNAM BEFORE AFTER - CONDITION BREAK |$tracedModemap| ''T))))) - (RETURN G1))) - -(defvar |$TraceFlag| t) - -(defun /MONITORX (/ARGS FUNCT OPTS &AUX NAME TYPE TRACECODE COUNTNAM TIMERNAM - BEFORE AFTER CONDITION BREAK TRACEDMODEMAP - BREAKCONDITION) - (declare (special /ARGS)) - (DCQ (NAME TYPE TRACECODE COUNTNAM TIMERNAM BEFORE AFTER CONDITION BREAK TRACEDMODEMAP BREAKCONDITION) OPTS) - (|stopTimer|) - (PROG (C V A NAME1 CURSTRM EVAL_TIME INIT_TIME NOT_TOP_LEVEL - (/DEPTH (if (and (BOUNDP '/DEPTH) (numberp /depth)) (1+ /DEPTH) 1)) - (|depthAlist| (if (BOUNDP '|depthAlist|) (COPY-TREE |depthAlist|) NIL)) - FUNDEPTH NAMEID YES (|$tracedSpadModemap| TRACEDMODEMAP) (|$mathTrace| NIL) - /caller /name /value /breakcondition curdepth) - (declare (special curstrm /depth fundepth |$tracedSpadModemap| |$mathTrace| - /caller /name /value /breakcondition |depthAlist|)) - (SETQ /NAME NAME) - (SETQ NAME1 (PNAME (|rassocSub| (INTERN NAME) |$mapSubNameAlist|))) - (SETQ /BREAKCONDITION BREAKCONDITION) - (SETQ /CALLER (|rassocSub| (WHOCALLED 6) |$mapSubNameAlist|)) - (if (NOT (STRINGP TRACECODE)) - (MOAN "set TRACECODE to \'1911\' and restart")) - (SETQ C (digit-char-p (elt TRACECODE 0)) - V (digit-char-p (elt TRACECODE 1)) - A (digit-char-p (elt TRACECODE 2))) - (if COUNTNAM (SET COUNTNAM (1+ (EVAL COUNTNAM)))) - (SETQ NAMEID (INTERN NAME)) - (SETQ NOT_TOP_LEVEL (ASSOC NAMEID |depthAlist| :test #'eq)) - (if (NOT NOT_TOP_LEVEL) - (SETQ |depthAlist| (CONS (CONS NAMEID 1) |depthAlist|)) - (RPLACD NOT_TOP_LEVEL (1+ (CDR NOT_TOP_LEVEL)))) - (SETQ FUNDEPTH (CDR (ASSOC NAMEID |depthAlist| :test #'eq))) - (SETQ CONDITION (MONITOR-EVALTRAN CONDITION NIL)) - (SETQ YES (EVALFUN CONDITION)) - (if (member NAMEID |$mathTraceList| :test #'eq) - (SETQ |$mathTrace| T)) - (if (AND YES |$TraceFlag|) - (PROG (|$TraceFlag|) - (SETQ CURSTRM *TERMINAL-IO*) - (if (EQUAL TRACECODE "000") (RETURN NIL)) - (TAB 0 CURSTRM) - (MONITOR-BLANKS (1- /DEPTH)) - (PRIN0 FUNDEPTH CURSTRM) - (|sayBrightlyNT| (LIST "<enter" '|%b| - NAME1 '|%d|) CURSTRM) - (COND ((EQ 0 C) NIL) - ((EQ TYPE 'MACRO) - (PRINT " expanded" CURSTRM)) - (T (PRINT " from " CURSTRM) - (PRIN0 /CALLER CURSTRM))) - (MONITOR-PRINARGS - (if (SPADSYSNAMEP NAME) - (NREVERSE (REVERSE (|coerceTraceArgs2E| - (INTERN NAME1) - (INTERN NAME) - /ARGS))) - (|coerceTraceArgs2E| (INTERN NAME1) - (INTERN NAME) /ARGS)) - TRACECODE - (GET (INTERN NAME) '/TRANSFORM)) - (if (NOT |$mathTrace|) (TERPRI CURSTRM)))) - (if before (MONITOR-EVALBEFORE BEFORE)) - (if (member '|before| BREAK :test #'eq) - (|break| (LIST "Break on entering" '|%b| NAME1 '|%d| ":"))) - (if TIMERNAM (SETQ INIT_TIME (|startTimer|))) - (SETQ /VALUE (if (EQ TYPE 'MACRO) (MDEFX FUNCT /ARGS) - (APPLY FUNCT /ARGS))) - (|stopTimer|) - (if TIMERNAM (SETQ EVAL_TIME (- (|clock|) INIT_TIME)) ) - (if (AND TIMERNAM (NOT NOT_TOP_LEVEL)) - (SET TIMERNAM (+ (EVAL TIMERNAM) EVAL_TIME))) - (if AFTER (MONITOR-EVALAFTER AFTER)) - (if (AND YES |$TraceFlag|) - (PROG (|$TraceFlag|) - (if (EQUAL TRACECODE "000") (GO SKIP)) - (TAB 0 CURSTRM) - (MONITOR-BLANKS (1- /DEPTH)) - (PRIN0 FUNDEPTH CURSTRM) - (|sayBrightlyNT| (LIST ">exit " '|%b| NAME1 '|%d|) CURSTRM) - (COND (TIMERNAM - (|sayBrightlyNT| '\( CURSTRM) - (|sayBrightlyNT| (/ EVAL_TIME 60.0) CURSTRM) - (|sayBrightlyNT| '\ sec\) CURSTRM) )) - (if (EQ 1 V) - (MONITOR-PRINVALUE - (|coerceTraceFunValue2E| - (INTERN NAME1) (INTERN NAME) /VALUE) - (INTERN NAME1))) - (if (NOT |$mathTrace|) (TERPRI CURSTRM)) - SKIP)) - (if (member '|after| BREAK :test #'eq) - (|break| (LIST "Break on exiting" '|%b| NAME1 '|%d| ":"))) - (|startTimer|) - (RETURN /VALUE))) - -; Functions to run a timer for tracing -; It avoids timing the tracing function itself by turning the timer -; on and off - -(defvar |$oldTime| 0) -(defvar |$timerOn| t) -(defvar $delay 0) - -(defun |startTimer| () - (SETQ $delay (PLUS $delay (DIFFERENCE (TEMPUS-FUGIT) |$oldTime|))) - (SETQ |$timerOn| 'T) - (|clock|)) - -(defun |stopTimer| () (SETQ |$oldTime| (TEMPUS-FUGIT) |$timerOn| NIL) (|clock|)) - -(defun |clock| () - (if |$timerOn| (- (TEMPUS-FUGIT) $delay) (- |$oldTime| $delay))) - -; Functions to trace/untrace a BPI; use as follows: -; To trace a BPI-value <bpi>, evaluate (SETQ <name> (BPITRACE <bpi>)) -; To later untrace <bpi>, evaluate (BPITRACE <name>) - -(defun PAIRTRACE (PAIR ALIAS) - (RPLACA PAIR (BPITRACE (CAR PAIR) ALIAS )) NIL) - -(defun BPITRACE (BPI ALIAS &optional OPTIONS) - (SETQ NEWNAME (GENSYM)) - (IF (identp bpi) (setq bpi (symbol-function bpi))) - (SET NEWNAME BPI) - (SETF (symbol-function NEWNAME) BPI) - (/TRACE-0 (APPEND (LIST NEWNAME (LIST 'ALIAS ALIAS)) OPTIONS)) - NEWNAME) - -(defun BPIUNTRACE (X ALIAS) (/UNTRACE-0 (LIST X (LIST 'ALIAS ALIAS)))) - -(defun SPADSYSNAMEP (STR) - (let (n i j) - (AND (SETQ N (MAXINDEX STR)) - (SETQ I (position #\. STR :start 1)) - (SETQ J (position #\, STR :start (1+ I))) - (do ((k (1+ j) (1+ k))) - ((> k n) t) - (if (not (digitp (elt str k))) (return nil)))))) - -; ********************************************************************** -; Utility functions for Tracing Package -; ********************************************************************** - -(MAKEPROP '|coerce| '/TRANSFORM '(& & *)) -(MAKEPROP '|comp| '/TRANSFORM '(& * * &)) -(MAKEPROP '|compIf| '/TRANSFORM '(& * * &)) - -; by having no transform for the 3rd argument, it is simply not printed - -(MAKEPROP '|compFormWithModemap| '/TRANSFORM '(& * * & *)) - -(defun UNVEC (X) - (COND ((REFVECP X) (CONS '$ (VEC_TO_TREE X))) - ((ATOM X) X) - ((CONS (UNVEC (CAR X)) (UNVEC (CDR X)))))) - -(defun DROPENV (X) (AND X (LIST (CAR X) (CADR X)))) - -(defun SHOWBIND (E) - (do ((v e (cdr v)) - (llev 1 (1+ llev))) - ((not v)) - (PRINT (LIST "LAMBDA LEVEL" LLEV)) - (do ((w (car v) (cdr w)) - (clev 1 (1+ clev))) - ((not w)) - (PRINT (LIST "CONTOUR LEVEL" CLEV)) - (PRINT (mapcar #'car (car W)))))) - -#+:CCL -(defun break (&rest ignore) (lisp-break ignore) (lisp::unwind)) - - -#+:CCL -(defun lisp-break (&rest ignore) - (prog (prompt ifile ofile u v) - (setq ifile (rds *debug-io*)) - (setq ofile (wrs *debug-io*)) - (setq prompt (setpchar "Break loop (:? for help)> ")) -top (setq u (read)) - (cond - ((equal u ':x) (go exit)) - ((equal u ':q) - (progn (lisp::enable-backtrace nil) - (princ "Backtrace now disabled") - (terpri))) - ((equal u ':v) - (progn (lisp::enable-backtrace t) - (princ "Backtrace now enabled") - (terpri))) - ((equal u ':?) - (progn - (princ ":Q disables backtrace") - (terpri) - (princ ":V enables backtrace") - (terpri) - (princ ":X exits from break loop") - (terpri) - (princ "else enter LISP expressions for evaluation") - (terpri))) - ((equal u #\eof) - (go exit)) - (t (progn - (setq v (errorset u nil nil)) - (if (listp v) (progn (princ "=> ") (prinl (car v)) (terpri))))) ) - (go top) -exit (rds ifile) - (wrs ofile) - (setpchar prompt) - (return nil))) - -(defun lisp-break-from-axiom (&rest ignore) - (boot::|handleLispBreakLoop| boot::|$BreakMode|)) -#+:CCL (setq lisp:*break-loop* 'boot::lisp-break-from-axiom) - -<<interrupt>> - -@ -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} |