Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

open-axiom repository from github

24005 views
1
;; Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd.
2
;; All rights reserved.
3
;; Copyright (C) 2007-2013, Gabriel Dos Reis.
4
;; All rights reserved.
5
;;
6
;; Redistribution and use in source and binary forms, with or without
7
;; modification, are permitted provided that the following conditions are
8
;; met:
9
;;
10
;; - Redistributions of source code must retain the above copyright
11
;; notice, this list of conditions and the following disclaimer.
12
;;
13
;; - Redistributions in binary form must reproduce the above copyright
14
;; notice, this list of conditions and the following disclaimer in
15
;; the documentation and/or other materials provided with the
16
;; distribution.
17
;;
18
;; - Neither the name of The Numerical Algorithms Group Ltd. nor the
19
;; names of its contributors may be used to endorse or promote products
20
;; derived from this software without specific prior written permission.
21
;;
22
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
23
;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24
;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26
;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29
;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30
;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31
;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32
;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34
35
36
;; A "resumable" break loop for use in trace etc. Unfortunately this
37
;; only works for CCL. We need to define a Common Lisp version. For
38
;; now the function is defined but does nothing.
39
40
41
;;; @(#)debug.lisp 2.5 90/02/15 10:27:33
42
43
; NAME: Debugging Package
44
; PURPOSE: Debugging hooks for Boot code
45
46
(import-module "sys-macros")
47
(import-module "lexing")
48
(in-package "BOOT")
49
50
(defvar S-SPADKEY NIL) ;" this is augmented by MAKESPADOP"
51
52
(DEFPARAMETER /COUNTLIST NIL)
53
(DEFPARAMETER /TIMERLIST NIL)
54
(DEFPARAMETER /TRACESIZE NIL "sets limit on size of object to be mathprinted")
55
(DEFVAR CURSTRM *TERMINAL-IO*)
56
(DEFVAR /TRACELETNAMES ())
57
(DEFVAR /PRETTY () "controls pretty printing of trace output")
58
(defparameter /ECHO NIL) ;;"prevents echo of SPAD or BOOT code with /c"
59
(MAKEPROP 'LISP '/TERMCHR '(#\ #\())
60
(MAKEPROP 'INPUT '/TERMCHR '(#\: #\< #\ #\())
61
(MAKEPROP 'SPAD '/TERMCHR '(#\: #\< #\ #\())
62
(MAKEPROP 'BOOT '/TERMCHR '(#\: #\< #\ #\())
63
64
(defmacro |/C,LIB| (&rest L &aux |$editFile|
65
($prettyprint 't) ($reportCompilation 't))
66
(declare (special |$editFile| $prettyprint $reportComilation))
67
`',(|compileConstructorLib| L (/COMP) NIL NIL))
68
69
(defmacro /C (&rest L) `',(/D-1 L (/COMP) NIL NIL))
70
71
(defmacro /CT (&rest L) `',(/D-1 L (/COMP) NIL 'T))
72
73
(defmacro /CTL (&rest L) `',(/D-1 L (/COMP) NIL 'TRACELET))
74
75
(defmacro /D (&rest L) `',(/D-1 L 'DEFINE NIL NIL))
76
77
(defmacro /EC (&rest L) `', (/D-1 L (/COMP) 'T NIL))
78
79
(defmacro /ECT (&rest L) `',(/D-1 L (/COMP) 'T 'T))
80
81
(defmacro /ECTL (&rest L) `',(/D-1 L (/COMP) 'T 'TRACELET))
82
83
(defmacro /E (&rest L) `',(/D-1 L NIL 'T NIL))
84
85
(defmacro /ED (&rest L) `',(/D-1 L 'DEFINE 'T NIL))
86
87
(defun heapelapsed () 0)
88
89
(defun /COMP () (if (fboundp '|backendCompile|) '|backendCompile| 'COMP370))
90
91
(defvar /fn nil)
92
93
(DEFPARAMETER /DEPTH 0)
94
95
(defparameter debugmode 'yes "Can be either YES or NO")
96
97
(defun reduction-print (y rule)
98
(format t "~&")
99
(cond ((eq y t) (|sayBrightly| `(|%b| ,rule |%d| " reduced")))
100
(y (|sayBrightlyNT| `(|%b| ,rule |%d|))
101
(format t " reduced ~A~%" y)))
102
y)
103
104
(defun /embed-1 (x y)
105
(princ (strconc (pname x) " embedded"))
106
(terpri)
107
(/embed-q x y))
108
109
(defvar /embednames)
110
111
(defun /embed-q (x y)
112
(setq /embednames (cons x /embednames))
113
(embed x
114
(cond ((eqcar y 'lambda) y)
115
((eqcar y 'before)
116
`(lambda ,(cadr y)
117
(prog2 ,(caddr y) ,(cons 'funcall (cons x (cadr y))))))
118
((eqcar y 'after)
119
`(lambda ,(cadr y)
120
(prog1 ,(cons 'funcall (cons x (cadr y))) ,(caddr y))))))
121
(/embedreply))
122
123
(defun /embedreply ()
124
(if (atom (embedded)) '(|none| |embedded|)
125
(append (embedded) (list '|embedded|))))
126
127
128
(DEFUN /D-1 (L OP EFLG TFLG)
129
(CATCH 'FILENAM
130
(PROG (TO OPTIONL OPTIONS FNL INFILE OUTSTREAM FN )
131
(declare (special fn infile outstream ))
132
(if (member '? L :test #'eq)
133
(RETURN (|runCommand| "EXEC SPADEDIT /C TELL")))
134
(SETQ OPTIONL (/OPTIONS L))
135
(SETQ FNL (TRUNCLIST L OPTIONL))
136
(SETQ OPTIONS (OPTIONS2UC OPTIONL))
137
(SETQ INFILE (/MKINFILENAM (/GETOPTION OPTIONS 'FROM)))
138
(SETQ TO (/GETOPTION OPTIONS 'TO))
139
(if TO (SETQ TO (/MKOUTFILENAM (/GETOPTION OPTIONS 'TO) INFILE)))
140
(SETQ OUTSTREAM (if TO (DEFSTREAM TO 'OUTPUT) |$OutputStream|))
141
(RETURN (mapcar #'(lambda (fn)
142
(/D-2 FN INFILE OUTSTREAM OP EFLG TFLG))
143
(or fnl (list /fn)))))))
144
145
(DEFUN |/D,2,LIB| (FN INFILE CUROUTSTREAM OP EDITFLAG TRACEFLAG)
146
(declare (special CUROUTSTREAM))
147
"Called from compConLib1 (see LISPLIB BOOT) to bind CUROUTSTREAM."
148
(/D-2 FN INFILE CUROUTSTREAM OP EDITFLAG TRACEFLAG))
149
150
(defparameter $linenumber 0)
151
152
(DEFUN /D-2 (FN INFILE OUTPUTSTREAM OP EDITFLAG TRACEFLAG)
153
(declare (special OUTPUTSTREAM))
154
(PROG (FT oft SFN X EDINFILE FILE DEF KEY RECNO U W SOURCEFILES
155
|$Echo| SINGLINEMODE INPUTSTREAM SPADERRORSTREAM
156
ISID NBLNK COMMENTCHR (/SOURCEFILES |$sourceFiles|)
157
METAKEYLST DEFINITION_NAME (|$sourceFileTypes| '(|spad| |boot| |lisp| |lsp| |meta|))
158
($FUNCTION FN) $NEWSPAD $LINESTACK $LINENUMBER STACK STACKX BACK OK
159
TRAPFLAG |$InteractiveMode| COLUMN *QUERY LINE
160
(|$backend| #'|evaluateLispDefinition|))
161
(declare (special |$Echo| SINGLINEMODE INPUTSTREAM |$backend|
162
SPADERRORSTREAM ISID NBLNK COMMENTCHR /SOURCEFILES
163
METAKEYLST DEFINITION_NAME |$sourceFileTypes|
164
$FUNCTION $NEWSPAD $LINESTACK $LINENUMBER STACK STACKX BACK OK
165
TRAPFLAG |$InteractiveMode| COLUMN *QUERY LINE))
166
(if (CONSP FN) (SETQ FN (QCAR FN)))
167
(SETQ INFILE (OR INFILE (|getFunctionSourceFile| FN)))
168
;; $FUNCTION is freely set in getFunctionSourceFile
169
(IF (CONSP $FUNCTION) (SETQ $FUNCTION (QCAR $FUNCTION)))
170
(SETQ FN $FUNCTION)
171
(SETQ /FN $FUNCTION)
172
LOOP (SETQ SOURCEFILES
173
(cond ( INFILE
174
(SETQ /SOURCEFILES (CONS INFILE (REMOVE INFILE /SOURCEFILES)))
175
(LIST INFILE))
176
(|$editFile|
177
(|insert| (|pathname| |$editFile|) /SOURCEFILES))
178
( 't /SOURCEFILES)))
179
(SETQ RECNO
180
(dolist (file sourcefiles)
181
(SETQ INPUTSTREAM (DEFSTREAM FILE 'INPUT))
182
183
;;?(REMFLAG S-SPADKEY 'KEY) ; hack !!
184
(SETQ FT (|pathnameType| FILE))
185
(SETQ oft (|object2Identifier| (UPCASE FT)))
186
(SETQ COMMENTCHR (GET oft '/COMMENTCHR))
187
(SETQ DEFINITION_NAME FN)
188
(SETQ KEY
189
(STRCONC
190
(OR (AND (EQ oFT 'SPAD) "")
191
(AND (EQ oFT 'BOOT) "")
192
(GET oFT '/PREFIX)
193
"")
194
(PNAME FN)))
195
(SETQ SFN (GET oFT '/READFUN))
196
(SETQ RECNO (/LOCATE FN KEY FILE 0))
197
(SHUT INPUTSTREAM)
198
(cond ((NUMBERP RECNO)
199
(SETQ /SOURCEFILES (CONS FILE (REMOVE FILE /SOURCEFILES)))
200
(SETQ INFILE FILE)
201
(RETURN RECNO)))) )
202
(if (NOT RECNO)
203
(if (SETQ INFILE (/MKINFILENAM '(NIL))) (GO LOOP) (|spadThrow|)))
204
(TERPRI)
205
(TERPRI)
206
(SETQ INFILE (|pathname| INFILE))
207
(COND
208
( EDITFLAG
209
;;%% next form is used because findFile seems to screw up
210
;;%% sometimes. The stream is opened and closed several times
211
;;%% in case the filemode has changed during editing.
212
(SETQ EDINFILE (|makeInputFilename| INFILE))
213
(SETQ INPUTSTREAM (DEFSTREAM EDINFILE 'INPUT))
214
(|sayBrightly|
215
(LIST " editing file" '|%b| (|namestring| EDINFILE) '|%d|))
216
(|runCommand|
217
(STRCONC
218
(|makeAbsoluteFilename| "/lib/SPADEDFN ")
219
(|namestring| EDINFILE)
220
" "
221
(STRINGIMAGE $LINENUMBER)))
222
(SHUT INPUTSTREAM)
223
;;%% next is done in case the diskmode changed
224
;;(SETQ INFILE (|pathname| (IFCAR
225
;; (QSORT ($LISTFILE INFILE)))))
226
(SETQ INPUTSTREAM (DEFSTREAM INFILE 'INPUT))
227
(SETQ RECNO (/LOCATE FN KEY INFILE RECNO))
228
229
(COND ((NOT RECNO)
230
(|sayBrightly| (LIST " Warning: function" "%b" /FN "%d"
231
"was not found in the file" "%l" " " "%b"
232
(|namestring| INFILE) "%d" "after editing."))
233
(RETURN NIL)))
234
;; next is done in case the diskmode changed
235
(SHUT INPUTSTREAM) ))
236
(SETQ INFILE (|makeInputFilename| INFILE))
237
(MAKEPROP /FN 'DEFLOC
238
(CONS RECNO INFILE))
239
(SETQ oft (|object2Identifier| (UPCASE (|pathnameType| INFILE))))
240
(COND
241
( (NULL OP)
242
(RETURN /FN) ) )
243
(COND
244
( (EQ TRACEFLAG 'TRACELET)
245
(RETURN (/TRACELET-1 (LIST FN) NIL)) ) )
246
(SETQ INPUTSTREAM (DEFSTREAM INFILE 'INPUT))
247
(|sayBrightly|
248
(LIST " Reading file" '|%b| (|namestring| INFILE) '|%d|))
249
(TERPRI)
250
(SETQ $NEWSPAD (EQ oft 'SPAD))
251
(SETQ DEF
252
(COND
253
( SFN
254
(POINT RECNO INPUTSTREAM)
255
(SETQ OK 'T)
256
(SETQ DEF (BOOT-PARSE-1 INPUTSTREAM))
257
(SETQ DEBUGMODE 'YES)
258
(COND
259
( (NULL OK)
260
(FUNCALL (GET oft 'SYNTAX_ERROR))
261
NIL )
262
( 'T
263
DEF ) ) )
264
( 'T
265
(let* ((mode-line (read-line inputstream))
266
(pacpos (|findString| "package:" mode-line))
267
(endpos (search "-*-" mode-line :from-end t))
268
(*package* *package*)
269
(newpac nil))
270
(when pacpos
271
(setq newpac (read-from-string mode-line nil nil
272
:start (+ pacpos 8)
273
:end endpos))
274
(setq *package*
275
(cond ((find-package newpac))
276
(t *package*))))
277
(POINT RECNO INPUTSTREAM)
278
(READ INPUTSTREAM)))))
279
#+Lucid(system::compiler-options :messages t :warnings t)
280
(COND
281
( (SETQ U (GET oft '/TRAN))
282
(SETQ DEF (FUNCALL U DEF)) ) )
283
(/WRITEUPDATE
284
/FN
285
(|pathnameName| INFILE)
286
(|pathnameType| INFILE)
287
(OR (|pathnameDirectory| INFILE) '*)
288
(OR (KAR (KAR (KDR DEF))) NIL)
289
OP)
290
(COND
291
( (OR /ECHO $|PrettyPrint|)
292
(PRETTYPRINT DEF OUTPUTSTREAM) ) )
293
(COND
294
( (EQ oft 'LISP)
295
(if (EQ OP 'DEFINE) (EVAL DEF)
296
(compile (EVAL DEF))))
297
( DEF
298
(FUNCALL OP (LIST DEF)) ) )
299
(COND
300
( TRACEFLAG
301
(/TRACE-2 /FN NIL) ) )
302
(SHUT INPUTSTREAM)
303
(RETURN (LIST /FN)) ) )
304
305
(DEFUN FUNLOC (func &aux file)
306
(if (CONSP func) (SETQ func (CAR func)))
307
(setq file (ifcar (findtag func)))
308
(if file (list (pathname-name file) (pathname-type file) func)
309
nil))
310
311
(DEFUN /LOCATE (FN KEY INFILE INITRECNO)
312
(PROG (FT RECNO KEYLENGTH LN)
313
(if (AND (NOT (eq 'FROMWRITEUPDATE (|pathnameName| INFILE)))
314
(NOT (|makeInputFilename| INFILE)))
315
(RETURN NIL))
316
(SETQ FT (UPCASE (|object2Identifier| (|pathnameType| INFILE))))
317
(SETQ KEYLENGTH (LENGTH KEY))
318
(WHEN (> INITRECNO 1) ;; we think we know where it is
319
(POINT INITRECNO |$InputStream|)
320
(SETQ LN (READ-LINE |$InputStream| NIL NIL))
321
(IF (AND LN (MATCH-FUNCTION-DEF FN KEY KEYLENGTH LN FT))
322
(RETURN INITRECNO)))
323
(SETQ $LINENUMBER 0)
324
(POINT 0 |$InputStream|)
325
EXAMINE (SETQ RECNO (NOTE |$InputStream|))
326
(SETQ LN (READ-LINE |$InputStream| NIL NIL))
327
(INCF $LINENUMBER)
328
(if (NULL LN) (RETURN NIL))
329
(IF (MATCH-FUNCTION-DEF FN KEY KEYLENGTH LN FT)
330
(RETURN RECNO))
331
(GO EXAMINE)))
332
333
(DEFUN MATCH-FUNCTION-DEF (fn key keylength line type)
334
(if (eq type 'LISP) (match-lisp-tag fn line "(def")
335
(let ((n (mismatch key line)))
336
(and (= n keylength)
337
(or (= n (length line))
338
(member (elt line n)
339
(or (get type '/termchr) '(#\space ))))))))
340
341
(define-function '|/D,1| #'/D-1)
342
343
(defvar /UPDATESTREAM nil)
344
345
346
(DEFUN /INITUPDATES (/VERSION)
347
(LET ((FILENAME (STRINGIMAGE /VERSION)))
348
(SETQ /UPDATESTREAM (open (strconc "/tmp/update." FILENAME)
349
:direction :output
350
:if-exists :append :if-does-not-exist :create)))
351
(PRINC
352
" Function Name Filename Date Time"
353
/UPDATESTREAM)
354
(TERPRI /UPDATESTREAM)
355
(PRINC
356
" --------------------------- ----------------------- -------- -----"
357
/UPDATESTREAM)
358
(TERPRI /UPDATESTREAM) )
359
360
(defun /UPDATE (&rest ARGS)
361
(LET (( FILENAME (OR (KAR ARGS)
362
(strconc "/tmp/update." (STRINGIMAGE /VERSION))))
363
(|$createUpdateFiles| NIL))
364
(DECLARE (SPECIAL |$createUpdateFiles|))
365
(CATCH 'FILENAM (/UPDATE-1 FILENAME '(/COMP)))
366
(SAY "Update is finished")))
367
368
(defun /DUPDATE (&rest ARGS)
369
(LET (( FILENAME (OR (KAR ARGS)
370
(strconc "/tmp/update." (STRINGIMAGE /VERSION))))
371
(|$createUpdateFiles| NIL))
372
(DECLARE (SPECIAL |$createUpdateFiles|))
373
(CATCH 'FILENAM (/UPDATE-1 FILENAME 'DEFINE))
374
(SAY "Update is finished")))
375
376
(DEFUN /UPDATE-1 (UPFILE OP)
377
;;if /VERSION=0 then no new update files will be written.
378
(prog (STREAM RECORD FUN FILE FUNFILES)
379
(SETQ STREAM (DEFSTREAM (/MKINFILENAM UPFILE) 'INPUT))
380
LOOP
381
(if (STREAM-EOF STREAM) (RETURN NIL))
382
(SETQ RECORD (read-line STREAM))
383
(if (NOT (STRINGP RECORD)) (RETURN NIL))
384
(if (< (LENGTH RECORD) 36) (GO LOOP))
385
(SETQ FUN (STRING2ID-N (SUBSTRING RECORD 0 36) 1))
386
(if (AND (NOT (EQUAL FUN 'QUAD)) (EQUAL (SUBSTRING RECORD 0 1) " "))
387
(GO LOOP))
388
(SETQ FILE (STRING2ID-N RECORD 2))
389
(if (member (cons fun file) funfiles :test #'equal) (go loop))
390
(push (cons fun file) funfiles)
391
(COND ((EQUAL FUN 'QUAD) (/RF-1 FILE))
392
((/D-2 FUN FILE |$OutputStream| OP NIL NIL)))
393
(GO LOOP)))
394
395
(DEFUN /WRITEUPDATE (FUN FN FT FM FTYPE OP)
396
397
;;;If /VERSION=0 then no save has yet been done.
398
;;;If A disk is not read-write, then issue msg and return.
399
;;;If /UPDATESTREAM not set or current /UPDATES file doesnt exist, initialize.
400
401
(PROG (IFT KEY RECNO ORECNO DATE TIME DATETIME)
402
(if (EQ 'INPUT FT) (RETURN NIL))
403
(if (NOT |$createUpdateFiles|) (RETURN NIL))
404
(if (OR (NOT (BOUNDP '/UPDATESTREAM))
405
(NOT (STREAMP /UPDATESTREAM)))
406
(/INITUPDATES /VERSION))
407
(SETQ DATETIME (|getDateAndTime|))
408
(SETQ DATE (CAR DATETIME))
409
(SETQ TIME (CDR DATETIME))
410
(PRINC (STRCONC
411
(COND ((NOT FUN) " QUAD ")
412
((STRINGPAD (PNAME FUN) 28))) " "
413
(STRINGIMAGE FM)
414
(STRINGIMAGE FN) "." (STRINGIMAGE FT)
415
" "
416
DATE " " TIME) /UPDATESTREAM)
417
(TERPRI /UPDATESTREAM)
418
))
419
420
(defun |getDateAndTime| ()
421
(MULTIPLE-VALUE-BIND (sec min hour day mon year) (get-decoded-time)
422
(CONS (STRCONC (LENGTH2STR mon) "/"
423
(LENGTH2STR day) "/"
424
(LENGTH2STR year) )
425
(STRCONC (LENGTH2STR hour) ":"
426
(LENGTH2STR min)))))
427
428
(DEFUN LENGTH2STR (X &aux XLEN)
429
(cond ( (= 1 (SETQ XLEN (LENGTH (SETQ X (STRINGIMAGE X))))) (STRCONC "0" X))
430
( (= 2 XLEN) X)
431
( (subseq x (- XLEN 2)))))
432
433
(defmacro /T (&rest L) (CONS '/TRACE (OR L (LIST /FN))))
434
435
(defmacro /TRACE (&rest L) `',(/TRACE-0 L))
436
437
(DEFUN /TRACE-0 (L)
438
(if (member '? L :test #'eq)
439
(|runCommand| "EXEC NORMEDIT TRACE TELL")
440
(let* ((options (/OPTIONS L)) (FNL (TRUNCLIST L OPTIONS)))
441
(/TRACE-1 FNL OPTIONS))))
442
443
(define-function '|/TRACE,0| #'/TRACE-0)
444
445
(defmacro /TRACEANDCOUNT (&rest L) `',
446
(let* ((OPTIONS (/OPTIONS L))
447
(FNL (TRUNCLIST L OPTIONS)))
448
(/TRACE-1 FNL (CONS '(DEPTH) OPTIONS))))
449
450
(DEFUN /TRACE-1 (FNLIST OPTIONS)
451
(mapcar #'(lambda (X) (/TRACE-2 X OPTIONS)) FNLIST)
452
(/TRACEREPLY))
453
454
(defvar |$traceDomains| t)
455
456
(DEFUN /TRACE-2 (FN OPTIONS)
457
(PROG (U FNVAL COUNTNAM TRACECODE BEFORE AFTER CONDITION
458
TRACENAME CALLER VARS BREAK FROM_CONDITION VARBREAK TIMERNAM
459
ONLYS G WITHIN_CONDITION DEPTH_CONDITION COUNT_CONDITION
460
LETFUNCODE MATHTRACE |$traceNoisely|)
461
(declare (special |$traceNoisely|))
462
(if (member FN /TRACENAMES :test #'eq) (/UNTRACE-2 FN NIL))
463
(SETQ OPTIONS (OPTIONS2UC OPTIONS))
464
(if (AND |$traceDomains| (|isFunctor| FN) (ATOM FN))
465
(RETURN (|traceDomainConstructor| FN OPTIONS)))
466
(SETQ MATHTRACE (/GETTRACEOPTIONS OPTIONS 'MATHPRINT))
467
(if (AND MATHTRACE (NOT (EQL (ELT (PNAME FN) 0) #\$)) (NOT (|gensym?| FN)))
468
(if (RASSOC FN |$mapSubNameAlist|)
469
(SETQ |$mathTraceList| (CONS FN |$mathTraceList|))
470
(|spadThrowBrightly|
471
(format nil "mathprint not available for ~A" FN))))
472
(SETQ VARS (/GETTRACEOPTIONS OPTIONS 'VARS))
473
(if VARS
474
(progn (if (NOT (CDR VARS)) (SETQ VARS 'all) (SETQ VARS (CDR VARS)))
475
(|tracelet| FN VARS)))
476
(SETQ BREAK (/GETTRACEOPTIONS OPTIONS 'BREAK))
477
(SETQ VARBREAK (/GETTRACEOPTIONS OPTIONS 'VARBREAK))
478
(if VARBREAK
479
(progn (if (NOT (CDR VARBREAK)) (SETQ VARS 'all)
480
(SETQ VARS (CDR VARBREAK)))
481
(|breaklet| FN VARS)))
482
(if (and (symbolp fn) (not (boundp FN)) (not (fboundp FN)))
483
(progn
484
(COND ((|isUncompiledMap| FN)
485
(|sayBrightly|
486
(format nil
487
"~A must be compiled before it may be traced -- invoke ~A to compile"
488
FN FN)))
489
((|isInterpOnlyMap| FN)
490
(|sayBrightly| (format nil
491
"~A cannot be traced because it is an interpret-only function" FN)))
492
(T (|sayBrightly| (format nil "~A is not a function" FN))))
493
(RETURN NIL)))
494
(if (and (symbolp fn) (boundp FN)
495
(|isDomainOrPackage| (SETQ FNVAL (EVAL FN))))
496
(RETURN (|spadTrace| FNVAL OPTIONS)))
497
(if (SETQ U (/GETTRACEOPTIONS OPTIONS 'MASK=))
498
(MAKEPROP FN '/TRANSFORM (CADR U)))
499
(SETQ /TRACENAMES
500
(COND ((/GETTRACEOPTIONS OPTIONS 'ALIAS) /TRACENAMES)
501
((ATOM /TRACENAMES) (LIST FN))
502
((CONS FN /TRACENAMES))))
503
(SETQ TRACENAME
504
(COND ((SETQ U (/GETTRACEOPTIONS OPTIONS 'ALIAS))
505
(STRINGIMAGE (CADR U)))
506
(T
507
(COND ((AND |$traceNoisely| (NOT VARS)
508
(NOT (|isSubForRedundantMapName| FN)))
509
(|sayBrightly|
510
(LIST '|%b| (|rassocSub| FN |$mapSubNameAlist|)
511
'|%d| "traced"))))
512
(STRINGIMAGE FN))))
513
(COND (|$fromSpadTrace|
514
(if MATHTRACE (push (INTERN TRACENAME) |$mathTraceList|))
515
(SETQ LETFUNCODE `(SETQ |$currentFunction| ,(MKQ FN)))
516
(SETQ BEFORE
517
(if (SETQ U (/GETTRACEOPTIONS OPTIONS 'BEFORE))
518
`(progn ,(CADR U) ,LETFUNCODE)
519
LETFUNCODE)))
520
(T (SETQ BEFORE
521
(if (SETQ U (/GETTRACEOPTIONS OPTIONS 'BEFORE))
522
(CADR U)))))
523
(SETQ AFTER (if (SETQ U (/GETTRACEOPTIONS OPTIONS 'AFTER)) (CADR U)))
524
(SETQ CALLER (/GETTRACEOPTIONS OPTIONS 'CALLER))
525
(SETQ FROM_CONDITION
526
(if (SETQ U (/GETTRACEOPTIONS OPTIONS 'FROM))
527
(LIST 'EQ '|#9| (LIST 'QUOTE (CADR U)))
528
T))
529
(SETQ CONDITION
530
(if (SETQ U (/GETTRACEOPTIONS OPTIONS 'WHEN)) (CADR U) T))
531
(SETQ WITHIN_CONDITION T)
532
(COND ((SETQ U (/GETTRACEOPTIONS OPTIONS 'WITHIN))
533
(SETQ G (INTERN (STRCONC (PNAME FN) "/" (PNAME (CADR U)))))
534
(SETF (SYMBOL-VALUE G) 0)
535
(/TRACE-1
536
(LIST (CADR U))
537
`((WHEN NIL)
538
(BEFORE (SETQ ,G (1+ ,G)))
539
(AFTER (SETQ ,G (1- ,G)))))
540
(SETQ WITHIN_CONDITION `(> ,G 0))))
541
(SETQ COUNTNAM
542
(AND (/GETTRACEOPTIONS OPTIONS 'COUNT)
543
(INTERN (STRCONC TRACENAME ",COUNT"))) )
544
(SETQ COUNT_CONDITION
545
(COND ((SETQ U (/GETTRACEOPTIONS OPTIONS 'COUNT))
546
(SETQ /COUNTLIST (adjoin TRACENAME /COUNTLIST
547
:test 'equal))
548
(if (AND (CDR U) (integerp (CADR U)))
549
`(cond ((<= ,COUNTNAM ,(CADR U)) t)
550
(t (/UNTRACE-2 ,(MKQ FN) NIL) NIL))
551
t))
552
(T T)))
553
(AND (/GETTRACEOPTIONS OPTIONS 'TIMER)
554
(SETQ TIMERNAM (INTERN (STRCONC TRACENAME ",TIMER")))
555
(SETQ /TIMERLIST (adjoin TRACENAME /TIMERLIST :test 'equal)))
556
(SETQ DEPTH_CONDITION
557
(if (SETQ U (/GETTRACEOPTIONS OPTIONS 'DEPTH))
558
(if (AND (CDR U) (integerp (CADR U)))
559
(LIST 'LE 'FUNDEPTH (CADR U))
560
(TRACE_OPTION_ERROR 'DEPTH))
561
T))
562
(SETQ CONDITION
563
(MKPF
564
(LIST CONDITION WITHIN_CONDITION FROM_CONDITION COUNT_CONDITION
565
DEPTH_CONDITION )
566
'AND))
567
(SETQ ONLYS (/GETTRACEOPTIONS OPTIONS 'ONLY))
568
569
;TRACECODE meaning:
570
; 0: Caller (0,1) print caller if 1
571
; 1: Value (0,1) print value if 1
572
; 2...: Arguments (0,...,9) stop if 0; print ith if i; all if 9
573
(SETQ TRACECODE
574
(if (/GETTRACEOPTIONS OPTIONS 'NT) "000"
575
(PROG (F A V C NL BUF)
576
(SETQ ONLYS (MAPCAR #'COND-UCASE ONLYS))
577
(SETQ F (OR (member 'F ONLYS :test #'eq)
578
(member 'FULL ONLYS :test #'eq)))
579
(SETQ A (OR F (member 'A ONLYS :test #'eq)
580
(member 'ARGS ONLYS :test #'eq)))
581
(SETQ V (OR F (member 'V ONLYS :test #'eq)
582
(member 'VALUE ONLYS :test #'eq)))
583
(SETQ C (OR F (member 'C ONLYS :test #'eq)
584
(member 'CALLER ONLYS :test #'eq)))
585
(SETQ NL
586
(if A '(#\9)
587
(mapcan #'(lambda (X)
588
(if (AND (INTEGERP X)
589
(> X 0)
590
(< X 9))
591
(LIST (ELT (STRINGIMAGE X) 0))))
592
onlys)))
593
(if (NOT (OR A V C NL))
594
(if Caller (return "119") (return "019")))
595
(SETQ NL (APPEND NL '(\0)))
596
(SETQ BUF (|makeString| 12))
597
(SUFFIX (if (or C Caller) #\1 #\0) BUF)
598
(SUFFIX (if V #\1 #\0) BUF)
599
(if A (suffix #\9 BUF)
600
(mapcar #'(lambda (x) (suffix x BUF)) NL))
601
(RETURN BUF))))
602
(/MONITOR FN TRACECODE BEFORE AFTER CONDITION TIMERNAM
603
COUNTNAM TRACENAME BREAK )))
604
605
(DEFUN OPTIONS2UC (L)
606
(COND ((NOT L) NIL)
607
((ATOM (CAR L))
608
(|spadThrowBrightly|
609
(format nil "~A has wrong format for an option" (car L))))
610
((CONS (CONS (LC2UC (CAAR L)) (CDAR L)) (OPTIONS2UC (CDR L))))))
611
612
(DEFUN COND-UCASE (X) (COND ((INTEGERP X) X) ((UPCASE X))))
613
614
(DEFUN TRACEOPTIONS (X)
615
(COND ((NOT X) NIL)
616
((EQ (CAR X) '/) X)
617
((TRACEOPTIONS (CDR X)))))
618
619
(defmacro |/untrace| (&rest L) `', (/UNTRACE-0 L))
620
621
(defmacro /UNTRACE (&rest L) `', (/UNTRACE-0 L))
622
623
(defmacro /U (&rest L) `', (/UNTRACE-0 L))
624
625
(DEFUN /UNTRACE-0 (L)
626
(PROG (OPTIONL OPTIONS FNL)
627
(if (member '? L :test #'eq) (RETURN (|runCommand| "EXEC NORMEDIT TRACE TELL")))
628
(SETQ OPTIONL (/OPTIONS L))
629
(SETQ FNL (TRUNCLIST L OPTIONL))
630
(SETQ OPTIONS (if OPTIONL (CAR OPTIONL)))
631
(RETURN (/UNTRACE-1 FNL OPTIONS))))
632
633
(define-function '|/UNTRACE,0| #'/UNTRACE-0)
634
635
(defun /UNTRACE-1 (L OPTIONS)
636
(cond
637
((NOT L)
638
(if (ATOM /TRACENAMES)
639
NIL
640
(mapcar #'(lambda (u) (/UNTRACE-2 (/UNTRACE-REDUCE U) OPTIONS))
641
(APPEND /TRACENAMES NIL))))
642
((mapcar #'(lambda (x) (/UNTRACE-2 X OPTIONS)) L)))
643
(/TRACEREPLY))
644
645
(DEFUN /UNTRACE-REDUCE (X) (if (ATOM X) X (first X))) ; (CAR X) is now a domain
646
647
(DEFUN /UNTRACE-2 (X OPTIONS)
648
(let (u y |$traceNoisely|)
649
(declare (special |$traceNoisely|))
650
(COND ((AND (|isFunctor| X) (ATOM X))
651
(|untraceDomainConstructor| X))
652
((OR (|isDomainOrPackage| (SETQ U X))
653
(and (symbolp X) (boundp X)
654
(|isDomain| (SETQ U (EVAL X)))))
655
(|spadUntrace| U OPTIONS))
656
((EQCAR OPTIONS 'ALIAS)
657
(if |$traceNoisely|
658
(|sayBrightly| (LIST '|%b| (CADR OPTIONS) '|%d| '**untraced)))
659
(SETQ /TIMERLIST
660
(REMOVE (STRINGIMAGE (CADR OPTIONS)) /TIMERLIST :test 'equal))
661
(SETQ /COUNTLIST
662
(REMOVE (STRINGIMAGE (CADR OPTIONS)) /COUNTLIST :test 'equal))
663
(SETQ |$mathTraceList|
664
(REMOVE (CADR OPTIONS) |$mathTraceList| :test 'equal))
665
(UNEMBED X))
666
((AND (NOT (MEMBER X /TRACENAMES))
667
(NOT (|isSubForRedundantMapName| X)))
668
(|sayBrightly|
669
(LIST
670
'|%b|
671
(|rassocSub| X |$mapSubNameAlist|)
672
'|%d|
673
"not traced")))
674
(T (SETQ /TRACENAMES (REMOVE X /TRACENAMES :test 'equal))
675
(SETQ |$mathTraceList|
676
(REMOVE (if (STRINGP X) (INTERN X) X) |$mathTraceList|))
677
(SETQ |$letAssoc| (DELASC X |$letAssoc|))
678
(setq Y (if (IS_GENVAR X) (|devaluate| (EVAL X)) X))
679
(SETQ /TIMERLIST (REMOVE (STRINGIMAGE Y) /TIMERLIST :test 'equal))
680
(SETF (SYMBOL-VALUE (INTERN (STRCONC Y ",TIMER"))) 0)
681
(SETQ /COUNTLIST (REMOVE (STRINGIMAGE Y) /COUNTLIST :test 'equal))
682
(SETF (SYMBOL-VALUE (INTERN (STRCONC Y ",COUNT"))) 0)
683
(COND ((AND |$traceNoisely| (NOT (|isSubForRedundantMapName| Y)))
684
(|sayBrightly|
685
(LIST '|%b| (|rassocSub| Y |$mapSubNameAlist|)
686
'|%d| "untraced"))))
687
(UNEMBED X)))))
688
689
;; the following is called by |clearCache|
690
(define-function '/UNTRACE\,2 #'/UNTRACE-2)
691
692
(DEFUN MONITOR-PRINVALUE (VAL NAME)
693
(let (u)
694
(COND ((setq U (GET NAME '/TRANSFORM))
695
(COND
696
((EQCAR U '&)
697
(PRINC "//" CURSTRM) (PRIN1 VAL CURSTRM) (TERPRI CURSTRM))
698
(T (PRINC "! " CURSTRM)
699
(PRIN1 (EVAL (SUBST (MKQ VAL) '* (CAR U))) CURSTRM)
700
(TERPRI CURSTRM)) ))
701
(T
702
(PRINC ": " CURSTRM)
703
(COND ((NOT (SMALL-ENOUGH VAL)) (|F,PRINT-ONE| VAL CURSTRM))
704
(/PRETTY (PRETTYPRINT VAL CURSTRM))
705
(T (COND (|$mathTrace| (TERPRI)))
706
(PRINMATHOR0 VAL CURSTRM)))))))
707
708
(DEFUN MONITOR-BLANKS (N) (PRINC (|makeString| N (|char| '| |)) CURSTRM))
709
710
(DEFUN MONITOR-EVALBEFORE (X) (EVAL (MONITOR-EVALTRAN X NIL)) X)
711
712
(DEFUN MONITOR-EVALAFTER (X) (EVAL (MONITOR-EVALTRAN X 'T)))
713
714
(DEFUN MONITOR-EVALTRAN (X FG)
715
(if (HAS_SHARP_VAR X) (MONITOR-EVALTRAN1 X FG) X))
716
717
(define-function 'MONITOR\,EVALTRAN #'MONITOR-EVALTRAN)
718
719
(DEFUN MONITOR-EVALTRAN1 (X FG)
720
(let (n)
721
(COND
722
((SETQ N (|isSharpVarWithNum| X)) (MONITOR-GETVALUE N FG))
723
((ATOM X) X)
724
((CONS (MONITOR-EVALTRAN1 (CAR X) FG)
725
(MONITOR-EVALTRAN1 (CDR X) FG))))))
726
727
(DEFUN HAS_SHARP_VAR (X)
728
(COND ((AND (ATOM X) (IS_SHARP_VAR X)) 'T)
729
((ATOM X) NIL)
730
((OR (HAS_SHARP_VAR (CAR X)) (HAS_SHARP_VAR (CDR X))))))
731
732
(DEFUN IS_SHARP_VAR (X)
733
(AND (|ident?| X)
734
(EQL (ELT (PNAME X) 0) #\#)
735
(INTEGERP (parse-integer (symbol-name X) :start 1))))
736
737
(DEFUN MONITOR-GETVALUE (N FG)
738
(PROG (/VALUE /caller /args /name)
739
(declare (special /value /caller /args /name))
740
(COND ((= N 0)
741
(if FG
742
(MKQ /VALUE)
743
(|spadThrowBrightly| "cannot ask for value before execution")))
744
((= N 9) (MKQ /CALLER))
745
((<= N (SIZE /ARGS)) (MKQ (ELT /ARGS (1- N))))
746
((|spadThrowBrightly| (LIST 'function '|%b| /NAME '|%d|
747
"does not have" '|%b| N '|%d| "arguments"))))))
748
749
(DEFUN MONITOR-PRINARGS (L CODE /TRANSFORM)
750
(let (N)
751
(cond
752
((= (digit-char-p (elt CODE 2)) 0) NIL)
753
((= (digit-char-p (elt CODE 2)) 9)
754
(cond
755
(/TRANSFORM
756
(mapcar
757
#'(lambda (x y)
758
(COND ((EQ Y '*)
759
(PRINC "\\ " CURSTRM)
760
(MONITOR-PRINT X CURSTRM))
761
((EQ Y '&)
762
(PRINC "\\\\" CURSTRM)
763
(TERPRI CURSTRM)
764
(PRINT X CURSTRM))
765
((NOT Y) (PRINC "! " CURSTRM))
766
(T
767
(PRINC "! " CURSTRM)
768
(MONITOR-PRINT
769
(EVAL (SUBST (MKQ X) '* Y)) CURSTRM))))
770
L (cdr /transform)))
771
(T (PRINC ": " CURSTRM)
772
(COND ((NOT (ATOM L))
773
(if |$mathTrace| (TERPRI CURSTRM))
774
(MONITOR-PRINT (CAR L) CURSTRM) (SETQ L (CDR L))))
775
(mapcar #'monitor-printrest L))))
776
((do ((istep 2 (+ istep 1))
777
(k (|maxIndex| code)))
778
((> istep k) nil)
779
(when (not (= 0 (SETQ N (digit-char-p (elt CODE ISTEP)))))
780
(PRINC "\\" CURSTRM)
781
(PRINMATHOR0 N CURSTRM)
782
(PRINC ": " CURSTRM)
783
(MONITOR-PRINARGS-1 L N)))))))
784
785
(DEFUN MONITOR-PRINTREST (X)
786
(COND ((NOT (SMALL-ENOUGH X))
787
(PROGN (TERPRI)
788
(MONITOR-BLANKS (1+ /DEPTH))
789
(PRINC "\\" CURSTRM)
790
(PRINT X CURSTRM)))
791
((PROGN (if (NOT |$mathTrace|) (PRINC "\\" CURSTRM))
792
(COND (/PRETTY (PRETTYPRINT X CURSTRM))
793
((PRINMATHOR0 X CURSTRM)))))))
794
795
(DEFUN MONITOR-PRINARGS-1 (L N)
796
(COND ((OR (ATOM L) (< N 1)) NIL)
797
((EQ N 1) (MONITOR-PRINT (CAR L) CURSTRM))
798
((MONITOR-PRINARGS-1 (CDR L) (1- N)))))
799
800
(DEFUN MONITOR-PRINT (X CURSTRM)
801
(COND ((NOT (SMALL-ENOUGH X)) (|F,PRINT-ONE| X CURSTRM))
802
(/PRETTY (PRETTYPRINT X CURSTRM))
803
((PRINMATHOR0 X CURSTRM))))
804
805
(DEFUN PRINMATHOR0 (X CURSTRM)
806
(if |$mathTrace| (|maprinSpecial| (|outputTran| X) /DEPTH 80)
807
(PRIN1 X CURSTRM)))
808
809
(DEFUN SMALL-ENOUGH (X) (if /TRACESIZE (SMALL-ENOUGH-COUNT X 0 /TRACESIZE) t))
810
811
(DEFUN SMALL-ENOUGH-COUNT (X N M)
812
"Returns number if number of nodes < M otherwise nil."
813
(COND ((< M N) NIL)
814
((simple-vector-p X)
815
(do ((i 0 (1+ i)) (k (|maxIndex| x)))
816
((> i k) n)
817
(if (NOT (SETQ N (SMALL-ENOUGH-COUNT (ELT X I) (1+ N) M)))
818
(RETURN NIL))))
819
((ATOM X) N)
820
((AND (SETQ N (SMALL-ENOUGH-COUNT (CAR X) (1+ N) M))
821
(SMALL-ENOUGH-COUNT (CDR X) N M)))))
822
823
(DEFUN /OPTIONS (X)
824
(COND ((ATOM X) NIL)
825
((OR (ATOM (CAR X)) (|isFunctor| (CAAR X))) (/OPTIONS (CDR X)))
826
(X)))
827
828
(DEFUN /GETOPTION (L OPT) (KDR (/GETTRACEOPTIONS L OPT)))
829
830
(DEFUN /GETTRACEOPTIONS (L OPT)
831
(COND ((ATOM L) NIL)
832
((EQ (KAR (CAR L)) OPT) (CAR L))
833
((/GETTRACEOPTIONS (CDR L) OPT))))
834
835
(DEFMACRO /TRACELET (&rest L) `',
836
(PROG (OPTIONL FNL)
837
(if (member '? L :test #'eq)
838
(RETURN (|runCommand| (if (EQ (SYSID) 1)
839
"EXEC NORMEDIT TRACELET TELL"
840
"$COPY AZ8F:TRLET.TELL")) ))
841
(SETQ OPTIONL (/OPTIONS L))
842
(SETQ FNL (TRUNCLIST L OPTIONL))
843
(RETURN (/TRACELET-1 FNL OPTIONL))))
844
845
(DEFUN /TRACELET-1 (FNLIST OPTIONL)
846
(mapcar #'(lambda (x) (/tracelet-2 x optionl)) fnlist)
847
(/TRACE-1 FNLIST OPTIONL)
848
(TRACELETREPLY))
849
850
(DEFUN TRACELETREPLY ()
851
(if (ATOM /TRACELETNAMES) '(none tracelet)
852
(APPEND /TRACELETNAMES (LIST 'tracelet))))
853
854
(DEFUN /TRACELET-2 (FN OPTIONL &AUX ($TRACELETFLAG T))
855
(/D-1 (CONS FN OPTIONL) '|backendCompile| NIL NIL)
856
(SETQ /TRACELETNAMES
857
(if (ATOM /TRACELETNAMES) (LIST FN) (CONS FN /TRACELETNAMES)))
858
FN)
859
860
(defmacro /TRACE-LET (A B)
861
`(PROG1 (SPADLET ,A ,B)
862
. ,(mapcar #'(lambda (x) `(/tracelet-print ',x ,x))
863
(if (ATOM A) (LIST A) A))))
864
865
(defun /TRACELET-PRINT (X Y &AUX (/PRETTY 'T))
866
(PRINC (STRCONC (PNAME X) ": ") |$OutputStream|)
867
(MONITOR-PRINT Y |$OutputStream|))
868
869
(defmacro /UNTRACELET (&rest L) `',
870
(COND
871
((NOT L)
872
(if (ATOM /TRACELETNAMES) NIL (EVAL (CONS '/UNTRACELET /TRACELETNAMES))))
873
((mapcar #'/untracelet-1 L))
874
((TRACELETREPLY))))
875
876
(DEFUN /UNTRACELET-1 (X)
877
(COND
878
((NOT (MEMBER X /TRACELETNAMES))
879
(PROGN (PRINT (STRCONC (PNAME X) " not tracelet")) (TERPRI)))
880
((PROGN
881
(/UNTRACELET-2 X)
882
(/D-1 (LIST X) '|backendCompile| NIL NIL)))))
883
884
(DEFUN /UNTRACELET-2 (X)
885
(SETQ /TRACELETNAMES (REMOVE X /TRACELETNAMES))
886
(PRINT (STRCONC (PNAME X) " untracelet")) (TERPRI))
887
888
(defmacro /EMBED (&rest L) `',
889
(COND ((NOT L) (/EMBEDREPLY))
890
((member '? L :test #'eq) (|runCommand| "EXEC NORMEDIT EMBED TELL"))
891
((EQ 2 (LENGTH L)) (/EMBED-1 (CAR L) (CADR L)))
892
((MOAN "IMPROPER USE OF /EMBED"))))
893
894
(defmacro /UNEMBED (&rest L) `',
895
(COND ((NOT L)
896
(if (ATOM (EMBEDDED)) NIL
897
(mapcar #'unembed (embedded)))
898
(SETQ /TRACENAMES NIL)
899
(SETQ /EMBEDNAMES NIL))
900
((mapcar #'/unembed-1 L)
901
(SETQ /TRACENAMES (S- /TRACENAMES L)) ))
902
(/EMBEDREPLY))
903
904
(defun /UNEMBED-Q (X)
905
(COND
906
((NOT (MEMBER X /EMBEDNAMES))
907
(ERROR (STRCONC (PNAME X) " not embeded")))
908
((PROGN
909
(SETQ /EMBEDNAMES (REMOVE X /EMBEDNAMES))
910
(UNEMBED X)))))
911
912
(defun /UNEMBED-1 (X)
913
(COND
914
((NOT (MEMBER X /EMBEDNAMES))
915
(|sayBrightly| (LIST '|%b| (PNAME X) '|%d| "not embeded" '|%l|)))
916
((PROGN
917
(SETQ /EMBEDNAMES (REMOVE X /EMBEDNAMES))
918
(|sayBrightly| (LIST '|%b| (PNAME X) '|%d| "unembeded" '|%l|))
919
(UNEMBED X))) ))
920
921
(defvar /breakcondition nil)
922
923
(defun /MONITOR (&rest G5)
924
(PROG (G1 G4 TRACECODE BEFORE AFTER CONDITION
925
TIMERNAM COUNTNAM TRACENAME BREAK)
926
(dcq (G1 TRACECODE BEFORE AFTER CONDITION TIMERNAM COUNTNAM TRACENAME BREAK) G5)
927
(SETQ G4 (macro-function G1))
928
(SETQ TRACECODE (OR TRACECODE "119"))
929
(if COUNTNAM (SETF (SYMBOL-VALUE COUNTNAM) 0))
930
(if TIMERNAM (SETF (SYMBOL-VALUE TIMERNAM) 0))
931
(EMBED
932
G1
933
(LIST
934
(if G4 'MLAMBDA 'LAMBDA)
935
'(&rest G6)
936
(LIST
937
'/MONITORX
938
(QUOTE G6)
939
G1
940
(LIST
941
'QUOTE
942
(LIST
943
TRACENAME (if G4 'MACRO) TRACECODE
944
COUNTNAM TIMERNAM BEFORE AFTER
945
CONDITION BREAK |$tracedModemap| ''T)))))
946
(RETURN G1)))
947
948
(defvar |$TraceFlag| t)
949
(defvar |depthAlist| nil)
950
951
(defun WHOCALLED (x) (declare (ignore x)) nil)
952
953
(defun /MONITORX (/ARGS FUNCT OPTS &AUX NAME TYPE TRACECODE COUNTNAM TIMERNAM
954
BEFORE AFTER CONDITION BREAK TRACEDMODEMAP
955
BREAKCONDITION)
956
(declare (special /ARGS))
957
(DCQ (NAME TYPE TRACECODE COUNTNAM TIMERNAM BEFORE AFTER CONDITION BREAK TRACEDMODEMAP BREAKCONDITION) OPTS)
958
(|stopTimer|)
959
(PROG (C V A NAME1 CURSTRM EVAL_TIME INIT_TIME NOT_TOP_LEVEL
960
(/DEPTH (if (and (BOUNDP '/DEPTH) (numberp /depth)) (1+ /DEPTH) 1))
961
(|depthAlist| (if (BOUNDP '|depthAlist|) (COPY-TREE |depthAlist|) NIL))
962
FUNDEPTH NAMEID YES (|$tracedSpadModemap| TRACEDMODEMAP) (|$mathTrace| NIL)
963
/caller /name /value /breakcondition curdepth)
964
(declare (special curstrm /depth fundepth |$tracedSpadModemap| |$mathTrace|
965
/caller /name /value /breakcondition |depthAlist|))
966
(SETQ /NAME NAME)
967
(SETQ NAME1 (PNAME (|rassocSub| (INTERN NAME) |$mapSubNameAlist|)))
968
(SETQ /BREAKCONDITION BREAKCONDITION)
969
(SETQ /CALLER (|rassocSub| (WHOCALLED 6) |$mapSubNameAlist|))
970
(if (NOT (STRINGP TRACECODE))
971
(MOAN "set TRACECODE to \'1911\' and restart"))
972
(SETQ C (digit-char-p (elt TRACECODE 0))
973
V (digit-char-p (elt TRACECODE 1))
974
A (digit-char-p (elt TRACECODE 2)))
975
(if COUNTNAM (SETF (SYMBOL-VALUE COUNTNAM) (1+ (EVAL COUNTNAM))))
976
(SETQ NAMEID (INTERN NAME))
977
(SETQ NOT_TOP_LEVEL (ASSOC NAMEID |depthAlist| :test #'eq))
978
(if (NOT NOT_TOP_LEVEL)
979
(SETQ |depthAlist| (CONS (CONS NAMEID 1) |depthAlist|))
980
(RPLACD NOT_TOP_LEVEL (1+ (CDR NOT_TOP_LEVEL))))
981
(SETQ FUNDEPTH (CDR (ASSOC NAMEID |depthAlist| :test #'eq)))
982
(SETQ CONDITION (MONITOR-EVALTRAN CONDITION NIL))
983
(SETQ YES (EVAL CONDITION))
984
(if (member NAMEID |$mathTraceList| :test #'eq)
985
(SETQ |$mathTrace| T))
986
(if (AND YES |$TraceFlag|)
987
(PROG (|$TraceFlag|)
988
(SETQ CURSTRM *TERMINAL-IO*)
989
(if (EQUAL TRACECODE "000") (RETURN NIL))
990
(TAB 0 CURSTRM)
991
(MONITOR-BLANKS (1- /DEPTH))
992
(PRIN1 FUNDEPTH CURSTRM)
993
(|sayBrightlyNT| (LIST "<enter" '|%b|
994
NAME1 '|%d|) CURSTRM)
995
(COND ((EQ 0 C) NIL)
996
((EQ TYPE 'MACRO)
997
(PRINT " expanded" CURSTRM))
998
(T (PRINT " from " CURSTRM)
999
(PRIN1 /CALLER CURSTRM)))
1000
(MONITOR-PRINARGS
1001
(if (SPADSYSNAMEP NAME)
1002
(|reverse!| (|reverse| (|coerceTraceArgs2E|
1003
(INTERN NAME1)
1004
(INTERN NAME)
1005
/ARGS)))
1006
(|coerceTraceArgs2E| (INTERN NAME1)
1007
(INTERN NAME) /ARGS))
1008
TRACECODE
1009
(GET (INTERN NAME) '/TRANSFORM))
1010
(if (NOT |$mathTrace|) (TERPRI CURSTRM))))
1011
(if before (MONITOR-EVALBEFORE BEFORE))
1012
(if (member '|before| BREAK :test #'eq)
1013
(|break| (LIST "Break on entering" '|%b| NAME1 '|%d| ":")))
1014
(if TIMERNAM (SETQ INIT_TIME (|startTimer|)))
1015
(SETQ /VALUE (if (EQ TYPE 'MACRO) (MDEF FUNCT /ARGS)
1016
(APPLY FUNCT /ARGS)))
1017
(|stopTimer|)
1018
(if TIMERNAM (SETQ EVAL_TIME (- (|clock|) INIT_TIME)) )
1019
(if (AND TIMERNAM (NOT NOT_TOP_LEVEL))
1020
(SETF (SYMBOL-VALUE TIMERNAM) (+ (EVAL TIMERNAM) EVAL_TIME)))
1021
(if AFTER (MONITOR-EVALAFTER AFTER))
1022
(if (AND YES |$TraceFlag|)
1023
(PROG (|$TraceFlag|)
1024
(if (EQUAL TRACECODE "000") (GO SKIP))
1025
(TAB 0 CURSTRM)
1026
(MONITOR-BLANKS (1- /DEPTH))
1027
(PRIN1 FUNDEPTH CURSTRM)
1028
(|sayBrightlyNT| (LIST ">exit " '|%b| NAME1 '|%d|) CURSTRM)
1029
(COND (TIMERNAM
1030
(|sayBrightlyNT| '\( CURSTRM)
1031
(|sayBrightlyNT| (/ EVAL_TIME 60.0) CURSTRM)
1032
(|sayBrightlyNT| '\ sec\) CURSTRM) ))
1033
(if (EQ 1 V)
1034
(MONITOR-PRINVALUE
1035
(|coerceTraceFunValue2E|
1036
(INTERN NAME1) (INTERN NAME) /VALUE)
1037
(INTERN NAME1)))
1038
(if (NOT |$mathTrace|) (TERPRI CURSTRM))
1039
SKIP))
1040
(if (member '|after| BREAK :test #'eq)
1041
(|break| (LIST "Break on exiting" '|%b| NAME1 '|%d| ":")))
1042
(|startTimer|)
1043
(RETURN /VALUE)))
1044
1045
; Functions to run a timer for tracing
1046
; It avoids timing the tracing function itself by turning the timer
1047
; on and off
1048
1049
(defvar |$oldTime| 0)
1050
(defvar |$timerOn| t)
1051
(defvar $delay 0)
1052
1053
(defun |startTimer| ()
1054
(SETQ $delay (PLUS $delay (DIFFERENCE (TEMPUS-FUGIT) |$oldTime|)))
1055
(SETQ |$timerOn| 'T)
1056
(|clock|))
1057
1058
(defun |stopTimer| () (SETQ |$oldTime| (TEMPUS-FUGIT) |$timerOn| NIL) (|clock|))
1059
1060
(defun |clock| ()
1061
(if |$timerOn| (- (TEMPUS-FUGIT) $delay) (- |$oldTime| $delay)))
1062
1063
; Functions to trace/untrace a BPI; use as follows:
1064
; To trace a BPI-value <bpi>, evaluate (SETQ <name> (BPITRACE <bpi>))
1065
; To later untrace <bpi>, evaluate (BPITRACE <name>)
1066
1067
(defun PAIRTRACE (PAIR ALIAS)
1068
(RPLACA PAIR (BPITRACE (CAR PAIR) ALIAS )) NIL)
1069
1070
(defun BPITRACE (BPI ALIAS &optional OPTIONS)
1071
(let ((NEWNAME (GENSYM)))
1072
(IF (|ident?| bpi) (setq bpi (symbol-function bpi)))
1073
(SETF (SYMBOL-VALUE NEWNAME) BPI)
1074
(SETF (symbol-function NEWNAME) BPI)
1075
(/TRACE-0 (APPEND (LIST NEWNAME (LIST 'ALIAS ALIAS)) OPTIONS))
1076
NEWNAME))
1077
1078
(defun BPIUNTRACE (X ALIAS) (/UNTRACE-0 (LIST X (LIST 'ALIAS ALIAS))))
1079
1080
(defun SPADSYSNAMEP (STR)
1081
(let (n i j)
1082
(AND (SETQ N (|maxIndex| STR))
1083
(SETQ I (|findChar| #\. STR 1))
1084
(SETQ J (|findChar| #\, STR (1+ I)))
1085
(do ((k (1+ j) (1+ k)))
1086
((> k n) t)
1087
(if (not (digitp (elt str k))) (return nil))))))
1088
1089
; **********************************************************************
1090
; Utility functions for Tracing Package
1091
; **********************************************************************
1092
1093
(MAKEPROP '|coerce| '/TRANSFORM '(& & *))
1094
(MAKEPROP '|comp| '/TRANSFORM '(& * * &))
1095
(MAKEPROP '|compIf| '/TRANSFORM '(& * * &))
1096
1097
; by having no transform for the 3rd argument, it is simply not printed
1098
1099
(MAKEPROP '|compFormWithModemap| '/TRANSFORM '(& & * * & *))
1100
1101
(defun UNVEC (X)
1102
(COND ((simple-vector-p X) (CONS '$ (VEC_TO_TREE X)))
1103
((ATOM X) X)
1104
((CONS (UNVEC (CAR X)) (UNVEC (CDR X))))))
1105
1106
(defun DROPENV (X) (AND X (LIST (CAR X) (CADR X))))
1107
1108
(defun SHOWBIND (E)
1109
(do ((v e (cdr v))
1110
(llev 1 (1+ llev)))
1111
((not v))
1112
(PRINT (LIST "LAMBDA LEVEL" LLEV))
1113
(do ((w (car v) (cdr w))
1114
(clev 1 (1+ clev)))
1115
((not w))
1116
(PRINT (LIST "CONTOUR LEVEL" CLEV))
1117
(PRINT (mapcar #'car (car W))))))
1118
1119
1120
(defun lisp-break-from-axiom (&rest ignore)
1121
(boot::|handleLispBreakLoop| boot::|$BreakMode|))
1122
1123
(defun interrupt (&rest ignore))
1124
1125
; **** 5. BOOT Error Handling
1126
1127
(defun SPAD_SYNTAX_ERROR (rd)
1128
"Print syntax error indication, underline character, scrub line."
1129
(BUMPERRORCOUNT '|syntax|)
1130
(COND ((AND (EQ DEBUGMODE 'YES) (NOT(CONSOLEINPUTP |$InputStream|)))
1131
(SPAD_LONG_ERROR rd))
1132
((SPAD_SHORT_ERROR rd)))
1133
(|ioClear!| rd)
1134
(throw |$SpadReaderTag| nil))
1135
1136
(defun SPAD_LONG_ERROR (rd)
1137
(SPAD_ERROR_LOC SPADERRORSTREAM)
1138
(|readerPrintCurrentLine| rd)
1139
(and |$lineStack| (format t "Currently preparsed lines are:~%~%"))
1140
(mapcar #'(lambda (line)
1141
(format t "~&~5D> ~A~%" (car line) (cdr Line)))
1142
|$lineStack|)
1143
(if (= |$validTokens| 0)
1144
(format t "~%There are no valid tokens.~%")
1145
(format t "~%The number of valid tokens is ~S.~%" |$validTokens|))
1146
(if (> |$validTokens| 0)
1147
(progn (format t "The current token is~%")
1148
(describe |$currentToken|)))
1149
(if (> |$validTokens| 1)
1150
(progn (format t "The next token is~%")
1151
(describe |$nextToken|)))
1152
(if (|tokenType| |$priorToken|)
1153
(progn (format t "The prior token was~%")
1154
(describe |$priorToken|)))
1155
(unless (EQUAL |$OutputStream| SPADERRORSTREAM)
1156
(SPAD_ERROR_LOC |$OutputStream|)
1157
(TERPRI |$OutputStream|)))
1158
1159
(defun SPAD_SHORT_ERROR (rd)
1160
(|readerPrintCurrentLine| rd))
1161
1162
(defun SPAD_ERROR_LOC (STR)
1163
(format str "******** Spad Syntax Error detected ********"))
1164
1165
1166