aboutsummaryrefslogtreecommitdiff
path: root/src/interp/trace.boot.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/trace.boot.pamphlet')
-rw-r--r--src/interp/trace.boot.pamphlet856
1 files changed, 0 insertions, 856 deletions
diff --git a/src/interp/trace.boot.pamphlet b/src/interp/trace.boot.pamphlet
deleted file mode 100644
index 1563ea98..00000000
--- a/src/interp/trace.boot.pamphlet
+++ /dev/null
@@ -1,856 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-
-\title{\File{src/interp/trace.boot} Pamphlet}
-\author{The Axiom Team}
-
-\begin{document}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-
-\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>>
-
---% Code for tracing functions
-
--- This code supports the )trace system command and allows the
--- tracing of LISP, BOOT and SPAD functions and interpreter maps.
-
-SETANDFILEQ($traceNoisely,NIL) -- give trace and untrace messages
-
-SETANDFILEQ($reportSpadTrace,NIL) -- reports traced funs
-
-SETANDFILEQ($optionAlist,NIL)
-
-SETANDFILEQ($tracedMapSignatures, NIL)
-
-SETANDFILEQ($traceOptionList,'(
- after _
- before _
- break_
- cond_
- count_
- depth_
- local_
- mathprint _
- nonquietly_
- nt_
- of_
- only_
- ops_
- restore_
- timer_
- varbreak _
- vars_
- within _
- ))
-
-
-SETANDFILEQ($lastUntraced,NIL)
-
-trace l == traceSpad2Cmd l
-
-traceSpad2Cmd l ==
- if l is ['Tuple, l1] then l := l1
- $mapSubNameAlist:= getMapSubNames(l)
- trace1 augmentTraceNames(l,$mapSubNameAlist)
- traceReply()
-
-trace1 l ==
- $traceNoisely: local := NIL
- if hasOption($options,'nonquietly) then $traceNoisely := true
- hasOption($options,'off) =>
- (ops := hasOption($options,'ops)) or
- (lops := hasOption($options,'local)) =>
- null l => throwKeyedMsg("S2IT0019",NIL)
- constructor := unabbrev
- atom l => l
- null rest l =>
- atom first l => first l
- first first l
- NIL
- not(isFunctor constructor) => throwKeyedMsg("S2IT0020",NIL)
- if ops then
- ops := getTraceOption ops
- NIL
- if lops then
- lops := rest getTraceOption lops
- untraceDomainLocalOps(constructor,lops)
- (1 < # $options) and not hasOption($options,'nonquietly) =>
- throwKeyedMsg("S2IT0021",NIL)
- untrace l
- hasOption($options,'stats) =>
- (1 < # $options) =>
- throwKeyedMsg("S2IT0001",['")trace ... )stats"])
- [.,:opt] := CAR $options
- -- look for )trace )stats to list the statistics
- -- )trace )stats reset to reset them
- null opt => -- list the statistics
- centerAndHighlight('"Traced function execution times",78,"-")
- ptimers ()
- SAY '" "
- centerAndHighlight('"Traced function execution counts",78,"-")
- pcounters ()
- selectOptionLC(first opt,'(reset),'optionError)
- resetSpacers()
- resetTimers()
- resetCounters()
- throwKeyedMsg("S2IT0002",NIL)
- a:= hasOption($options,'restore) =>
- null(oldL:= $lastUntraced) => nil
- newOptions:= delete(a,$options)
- null l => trace1 oldL
- for x in l repeat
- x is [domain,:opList] and VECP domain =>
- sayKeyedMsg("S2IT0003",[devaluate domain])
- $options:= [:newOptions,:LASSOC(x,$optionAlist)]
- trace1 LIST x
- null l => nil
- l is ["?"] => _?t()
- traceList:= [transTraceItem x for x in l] or return nil
- for x in traceList repeat $optionAlist:=
- ADDASSOC(x,$options,$optionAlist)
- optionList:= getTraceOptions $options
- argument:=
- domainList:= LASSOC("of",optionList) =>
- LASSOC("ops",optionList) =>
- throwKeyedMsg("S2IT0004",NIL)
- opList:=
- traceList => LIST ["ops",:traceList]
- nil
- varList:=
- y:= LASSOC("vars",optionList) => LIST ["vars",:y]
- nil
- [:domainList,:opList,:varList]
- optionList => [:traceList,:optionList]
- traceList
- _/TRACE_,0 [funName for funName in argument]
- saveMapSig [funName for funName in argument]
-
-getTraceOptions options ==
- $traceErrorStack: local
- optionList:= [getTraceOption x for x in options]
- $traceErrorStack =>
- null rest $traceErrorStack =>
- [key,parms] := first $traceErrorStack
- throwKeyedMsg(key,['"",:parms])
- throwListOfKeyedMsgs("S2IT0017",[# $traceErrorStack],
- NREVERSE $traceErrorStack)
- optionList
-
-saveMapSig(funNames) ==
- for name in funNames repeat
- map:= rassoc(name,$mapSubNameAlist) =>
- $tracedMapSignatures:= ADDASSOC(name,getMapSig(map,name),
- $tracedMapSignatures)
-
-getMapSig(mapName,subName) ==
- lmms:= get(mapName,'localModemap,$InteractiveFrame) =>
- for mm in lmms until sig repeat
- CADR mm = subName => sig:= CDAR mm
- sig
-
-getTraceOption (x is [key,:l]) ==
- key:= selectOptionLC(key,$traceOptionList,'traceOptionError)
- x := [key,:l]
- MEMQ(key,'(nonquietly timer nt)) => x
- key='break =>
- null l => ['break,'before]
- opts := [selectOptionLC(y,'(before after),NIL) for y in l]
- and/[IDENTP y for y in opts] => ['break,:opts]
- stackTraceOptionError ["S2IT0008",NIL]
- key='restore =>
- null l => x
- stackTraceOptionError ["S2IT0009",[STRCONC('")",object2String key)]]
- key='only => ['only,:transOnlyOption l]
- key='within =>
- l is [a] and IDENTP a => x
- stackTraceOptionError ["S2IT0010",['")within"]]
- MEMQ(key,'(cond before after)) =>
- key:=
- key="cond" => "when"
- key
- l is [a] => [key,:l]
- stackTraceOptionError ["S2IT0011",[STRCONC('")",object2String key)]]
- key='depth =>
- l is [n] and FIXP n => x
- stackTraceOptionError ["S2IT0012",['")depth"]]
- key='count =>
- (null l) or (l is [n] and FIXP n) => x
- stackTraceOptionError ["S2IT0012",['")count"]]
- key="of" =>
- ["of",:[hn y for y in l]] where
- hn x ==
- atom x and not UPPER_-CASE_-P (STRINGIMAGE x).(0) =>
- isDomainOrPackage EVAL x => x
- stackTraceOptionError ["S2IT0013",[x]]
- g:= domainToGenvar x => g
- stackTraceOptionError ["S2IT0013",[x]]
- MEMQ(key,'(local ops vars)) =>
- null l or l is ["all"] => [key,:"all"]
- isListOfIdentifiersOrStrings l => x
- stackTraceOptionError ["S2IT0015",[STRCONC('")",object2String key)]]
- key='varbreak =>
- null l or l is ["all"] => ["varbreak",:"all"]
- isListOfIdentifiers l => x
- stackTraceOptionError ["S2IT0016",[STRCONC('")",object2String key)]]
- key='mathprint =>
- null l => x
- stackTraceOptionError ["S2IT0009",[STRCONC('")",object2String key)]]
- key => throwKeyedMsg("S2IT0005",[key])
-
-traceOptionError(opt,keys) ==
- null keys => stackTraceOptionError ["S2IT0007",[opt]]
- commandAmbiguityError("trace option",opt,keys)
-
-resetTimers () ==
- for timer in _/TIMERLIST repeat
- SET(INTERN STRCONC(timer,'"_,TIMER"),0)
-
-resetSpacers () ==
- for spacer in _/SPACELIST repeat
- SET(INTERN STRCONC(spacer,'"_,SPACE"),0)
-
-resetCounters () ==
- for k in _/COUNTLIST repeat
- SET(INTERN STRCONC(k,'"_,COUNT"),0)
-
-ptimers() ==
- null _/TIMERLIST => sayBrightly '" no functions are timed"
- for timer in _/TIMERLIST repeat
- sayBrightly [" ",:bright timer,'_:,'" ",
- EVAL(INTERN STRCONC(timer,'"_,TIMER")) / float $timerTicksPerSecond,'" sec."]
-
-pspacers() ==
- null _/SPACELIST => sayBrightly '" no functions have space monitored"
- for spacer in _/SPACELIST repeat
- sayBrightly [" ",:bright spacer,'_:,'" ",
- EVAL INTERN STRCONC(spacer,'"_,SPACE"),'" bytes"]
-
-pcounters() ==
- null _/COUNTLIST => sayBrightly '" no functions are being counted"
- for k in _/COUNTLIST repeat
- sayBrightly [" ",:bright k,'_:,'" ",
- EVAL INTERN STRCONC(k,'"_,COUNT"),'" times"]
-
-transOnlyOption l ==
- l is [n,:y] =>
- FIXP n => [n,:transOnlyOption y]
- MEMQ(n:= UPCASE n,'(V A C)) => [n,:transOnlyOption y]
- stackTraceOptionError ["S2IT0006",[n]]
- transOnlyOption y
- nil
-
-stackTraceOptionError x ==
- $traceErrorStack:= [x,:$traceErrorStack]
- nil
-
-removeOption(op,options) ==
- [optEntry for (optEntry:=[opt,:.]) in options | opt ^= op]
-
-domainToGenvar x ==
- $doNotAddEmptyModeIfTrue: local:= true
- (y:= unabbrevAndLoad x) and GETDATABASE(opOf y,'CONSTRUCTORKIND) = 'domain =>
- g:= genDomainTraceName y
- SET(g,evalDomain y)
- g
-
-genDomainTraceName y ==
- u:= LASSOC(y,$domainTraceNameAssoc) => u
- g:= GENVAR()
- $domainTraceNameAssoc:= [[y,:g],:$domainTraceNameAssoc]
- g
-
---this is now called from trace with the )off option
-untrace l ==
- $lastUntraced:=
- null l => COPY _/TRACENAMES
- l
- untraceList:= [transTraceItem x for x in l]
- _/UNTRACE_,0 [lassocSub(funName,$mapSubNameAlist) for
- funName in untraceList]
- removeTracedMapSigs untraceList
-
-transTraceItem x ==
- $doNotAddEmptyModeIfTrue: local:=true
- atom x =>
- (value:=get(x,"value",$InteractiveFrame)) and
- (objMode value in '((Mode) (Domain) (SubDomain (Domain)))) =>
- x := objVal value
- (y:= domainToGenvar x) => y
- x
- UPPER_-CASE_-P (STRINGIMAGE x).(0) =>
- y := unabbrev x
- constructor?(y) => y
- PAIRP(y) and constructor?(CAR y) => CAR y
- (y:= domainToGenvar x) => y
- x
- x
- VECP first x => transTraceItem devaluate first x
- y:= domainToGenvar x => y
- throwKeyedMsg("S2IT0018",[x])
-
-removeTracedMapSigs untraceList ==
- for name in untraceList repeat
- REMPROP(name,$tracedMapSignatures)
-
-coerceTraceArgs2E(traceName,subName,args) ==
- MEMQ(name:= subName,$mathTraceList) =>
- SPADSYSNAMEP PNAME name => coerceSpadArgs2E(reverse CDR reverse args)
- [["=",name,objValUnwrap coerceInteractive(objNewWrap(arg,type),$OutputForm)]
- for name in '(arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14 arg15 arg16 arg17 arg18 arg19 )
- for arg in args for type in CDR LASSOC(subName,
- $tracedMapSignatures)]
- SPADSYSNAMEP PNAME name => reverse CDR reverse args
- args
-
-coerceSpadArgs2E(args) ==
- -- following binding is to prevent forcing calculation of stream elements
- $streamCount:local := 0
- [["=",name,objValUnwrap coerceInteractive(objNewWrap(arg,type),$OutputForm)]
- for name in '(arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14 arg15 arg16 arg17 arg18 arg19 )
- for arg in args for type in CDR $tracedSpadModemap]
-
-subTypes(mm,sublist) ==
- ATOM mm =>
- (s:= LASSOC(mm,sublist)) => s
- mm
- [subTypes(m,sublist) for m in mm]
-
-coerceTraceFunValue2E(traceName,subName,value) ==
- MEMQ(name:= subName,$mathTraceList) =>
- SPADSYSNAMEP PNAME traceName => coerceSpadFunValue2E(value)
- (u:=LASSOC(subName,$tracedMapSignatures)) =>
- objValUnwrap coerceInteractive(objNewWrap(value,CAR u),$OutputForm)
- value
- value
-
-coerceSpadFunValue2E(value) ==
- -- following binding is to prevent forcing calculation of stream elements
- $streamCount:local := 0
- objValUnwrap coerceInteractive(objNewWrap(value,CAR $tracedSpadModemap),
- $OutputForm)
-
-isListOfIdentifiers l == and/[IDENTP x for x in l]
-
-isListOfIdentifiersOrStrings l == and/[IDENTP x or STRINGP x for x in l]
-
-getMapSubNames(l) ==
- subs:= nil
- for mapName in l repeat
- lmm:= get(mapName,'localModemap,$InteractiveFrame) =>
- subs:= APPEND([[mapName,:CADR mm] for mm in lmm],subs)
- union(subs,getPreviousMapSubNames UNIONQ(_/TRACENAMES,
- $lastUntraced))
-
-getPreviousMapSubNames(traceNames) ==
- subs:= nil
- for mapName in ASSOCLEFT CAAR $InteractiveFrame repeat
- lmm:= get(mapName,'localModemap,$InteractiveFrame) =>
- MEMQ(CADAR lmm,traceNames) =>
- for mm in lmm repeat
- subs:= [[mapName,:CADR mm],:subs]
- subs
-
-lassocSub(x,subs) ==
- y:= LASSQ(x,subs) => y
- x
-
-rassocSub(x,subs) ==
- y:= rassoc(x,subs) => y
- x
-
-isUncompiledMap(x) ==
- y:= get(x,'value,$InteractiveFrame) =>
- (CAAR y) = 'MAP and null get(x,'localModemap,$InteractiveFrame)
-
-isInterpOnlyMap(map) ==
- x:= get(map,'localModemap,$InteractiveFrame) =>
- (CAAAR x) = 'interpOnly
-
-augmentTraceNames(l,mapSubNames) ==
- res:= nil
- for traceName in l repeat
- mml:= get(traceName,'localModemap,$InteractiveFrame) =>
- res:= APPEND([CADR mm for mm in mml],res)
- res:= [traceName,:res]
- res
-
-isSubForRedundantMapName(subName) ==
- mapName:= rassocSub(subName,$mapSubNameAlist) =>
- tail:=member([mapName,:subName],$mapSubNameAlist) =>
- MEMQ(mapName,CDR ASSOCLEFT tail)
-
-untraceMapSubNames traceNames ==
- null($mapSubNameAlist:local:= getPreviousMapSubNames traceNames) => nil
- for name in (subs:= ASSOCRIGHT $mapSubNameAlist)
- | MEMQ(name,_/TRACENAMES) repeat
- _/UNTRACE_,2(name,nil)
- $lastUntraced:= SETDIFFERENCE($lastUntraced,subs)
-
-funfind("functor","opname") ==
- ops:= isFunctor functor
- [u for u in ops | u is [[ =opname,:.],:.]]
-
-isDomainOrPackage dom ==
- REFVECP dom and #dom>0 and isFunctor opOf dom.(0)
-
-isTraceGensym x == GENSYMP x
-
-spadTrace(domain,options) ==
- $fromSpadTrace:= true
- $tracedModemap:local:= nil
- PAIRP domain and REFVECP CAR domain and (CAR domain).0 = 0 =>
- aldorTrace(domain,options)
- not isDomainOrPackage domain => userError '"bad argument to trace"
- listOfOperations:=
- [g x for x in getOption("OPS",options)] where
- g x ==
- STRINGP x => INTERN x
- x
- if listOfVariables := getOption("VARS",options) then
- options := removeOption("VARS",options)
- if listOfBreakVars := getOption("VARBREAK",options) then
- options := removeOption("VARBREAK",options)
- anyifTrue:= null listOfOperations
- domainId:= opOf domain.(0)
- currentEntry:= ASSOC(domain,_/TRACENAMES)
- currentAlist:= KDR currentEntry
- opStructureList:= flattenOperationAlist getOperationAlistFromLisplib domainId
- sigSlotNumberAlist:=
- [triple
- --new form is (<op> <signature> <slotNumber> <condition> <kind>)
- for [op,sig,n,.,kind] in opStructureList | kind = 'ELT
- and (anyifTrue or MEMQ(op,listOfOperations)) and
- FIXP n and
- isTraceable(triple:= [op,sig,n],domain)] where
- isTraceable(x is [.,.,n,:.],domain) ==
- atom domain.n => nil
- functionSlot:= first domain.n
- GENSYMP functionSlot =>
- (reportSpadTrace("Already Traced",x); nil)
- null (BPINAME functionSlot) =>
- (reportSpadTrace("No function for",x); nil)
- true
- if listOfVariables then
- for [.,.,n] in sigSlotNumberAlist repeat
- fn := first domain.n
- $letAssoc := AS_-INSERT(BPINAME fn,
- listOfVariables,$letAssoc)
- if listOfBreakVars then
- for [.,.,n] in sigSlotNumberAlist repeat
- fn := first domain.n
- $letAssoc := AS_-INSERT(BPINAME fn,
- [["BREAK",:listOfBreakVars]],$letAssoc)
- for (pair:= [op,mm,n]) in sigSlotNumberAlist repeat
- alias:= spadTraceAlias(domainId,op,n)
- $tracedModemap:= subTypes(mm,constructSubst(domain.0))
- traceName:= BPITRACE(first domain.n,alias, options)
- NCONC(pair,[listOfVariables,first domain.n,traceName,alias])
- RPLAC(first domain.n,traceName)
- sigSlotNumberAlist:= [x for x in sigSlotNumberAlist | CDDDR x]
- if $reportSpadTrace then
- if $traceNoisely then printDashedLine()
- for x in orderBySlotNumber sigSlotNumberAlist repeat
- reportSpadTrace("TRACING",x)
- if $letAssoc then SETLETPRINTFLAG true
- currentEntry =>
- RPLAC(rest currentEntry,[:sigSlotNumberAlist,:currentAlist])
- SETQ(_/TRACENAMES,[[domain,:sigSlotNumberAlist],:_/TRACENAMES])
- spadReply()
-
-traceDomainLocalOps(dom,lops,options) ==
- sayMSG ['" ",'"The )local option has been withdrawn"]
- sayMSG ['" ",'"Use )ltr to trace local functions."]
- NIL
--- abb := abbreviate dom
--- loadLibIfNotLoaded abb
--- actualLops := getLocalOpsFromLisplib abb
--- null actualLops =>
--- sayMSG ['" ",:bright abb,'"has no local functions to trace."]
--- lops = 'all => _/TRACE_,1(actualLops,options)
--- l := NIL
--- for lop in lops repeat
--- internalName := INTERN STRCONC(PNAME abb,'";",PNAME lop)
--- not MEMQ(internalName,actualLops) =>
--- sayMSG ['" ",:bright abb,'"does not have a local",
--- '" function called",:bright lop]
--- l := cons(internalName,l)
--- l => _/TRACE_,1(l,options)
--- nil
-
-untraceDomainLocalOps(dom,lops) ==
- sayMSG ['" ",:bright abb,'"has no local functions to untrace."]
- NIL
--- lops = "all" => untraceAllDomainLocalOps(dom)
--- abb := abbreviate dom
--- loadLibIfNotLoaded abb
--- actualLops := getLocalOpsFromLisplib abb
--- null actualLops =>
--- sayMSG ['" ",:bright abb,'"has no local functions to untrace."]
--- l := NIL
--- for lop in lops repeat
--- internalName := INTERN STRCONC(PNAME abb,'";",PNAME lop)
--- not MEMQ(internalName,actualLops) =>
--- sayMSG ['" ",:bright abb,'"does not have a local",
--- '" function called",:bright lop]
--- l := cons(internalName,l)
--- l => untrace l
--- nil
-
-untraceAllDomainLocalOps(dom) == NIL
--- abb := abbreviate dom
--- actualLops := getLocalOpsFromLisplib abb
--- null (l := intersection(actualLops,_/TRACENAMES)) => NIL
--- _/UNTRACE_,1(l,NIL)
--- NIL
-
-traceDomainConstructor(domainConstructor,options) ==
- -- Trace all domains built with the given domain constructor,
- -- including all presently instantiated domains, and all future
- -- instantiations, while domain constructor is traced.
- loadFunctor domainConstructor
- listOfLocalOps := getOption("LOCAL",options)
- if listOfLocalOps then
- traceDomainLocalOps(domainConstructor,listOfLocalOps,
- [opt for opt in options | opt isnt ['LOCAL,:.]])
- listOfLocalOps and not getOption("OPS",options) => NIL
- for [argl,.,:domain] in HGET($ConstructorCache,domainConstructor)
- repeat spadTrace(domain,options)
- SETQ(_/TRACENAMES,[domainConstructor,:_/TRACENAMES])
- innerDomainConstructor := INTERN STRCONC(domainConstructor,'";")
- if FBOUNDP innerDomainConstructor then domainConstructor := innerDomainConstructor
- EMBED(domainConstructor,
- ['LAMBDA, ['_&REST, 'args],
- ['PROG, ['domain],
- ['SETQ,'domain,['APPLY,domainConstructor,'args]],
- ['spadTrace,'domain,MKQ options],
- ['RETURN,'domain]]] )
-
-untraceDomainConstructor domainConstructor ==
- --untrace all the domains in domainConstructor, and unembed it
- SETQ(_/TRACENAMES,
- [df for df in _/TRACENAMES | keepTraced?(df, domainConstructor)]) where
- keepTraced?(df, domainConstructor) ==
- (df is [dc,:.]) and (isDomainOrPackage dc) and
- ((KAR devaluate dc) = domainConstructor) =>
- _/UNTRACE_,0 [dc]
- false
- true
- untraceAllDomainLocalOps domainConstructor
- innerDomainConstructor := INTERN STRCONC(domainConstructor,'";")
- if FBOUNDP innerDomainConstructor then UNEMBED innerDomainConstructor
- else UNEMBED domainConstructor
- SETQ(_/TRACENAMES,delete(domainConstructor,_/TRACENAMES))
-
-flattenOperationAlist(opAlist) ==
- res:= nil
- for [op,:mmList] in opAlist repeat
- res:=[:res,:[[op,:mm] for mm in mmList]]
- res
-
-mapLetPrint(x,val,currentFunction) ==
- x:= getAliasIfTracedMapParameter(x,currentFunction)
- currentFunction:= getBpiNameIfTracedMap currentFunction
- letPrint(x,val,currentFunction)
-
--- This is the version for use when we have no idea
--- what print representation to use for the data object
-
-letPrint(x,val,currentFunction) ==
- if $letAssoc and
- ((y:= LASSOC(currentFunction,$letAssoc)) or (y:= LASSOC("all",$letAssoc))) then
- if (y="all" or MEMQ(x,y)) and
- not (IS__GENVAR(x) or isSharpVarWithNum(x) or GENSYMP x) then
- sayBrightlyNT [:bright x,": "]
- PRIN0 shortenForPrinting val
- TERPRI()
- if (y:= hasPair("BREAK",y)) and
- (y="all" or MEMQ(x,y) and
- (not MEMQ((PNAME x).(0),'($ _#)) and not GENSYMP x)) then
- break [:bright currentFunction,'"breaks after",:bright x,'":= ",
- shortenForPrinting val]
- val
-
--- This is the version for use when we have already
--- converted the data into type "Expression"
-letPrint2(x,printform,currentFunction) ==
- $BreakMode:local
- if $letAssoc and
- ((y:= LASSOC(currentFunction,$letAssoc)) or (y:= LASSOC("all",$letAssoc))) then
- if (y="all" or MEMQ(x,y)) and
- not (IS__GENVAR(x) or isSharpVarWithNum(x) or GENSYMP x) then
- $BreakMode:='letPrint2
- flag:=nil
- CATCH('letPrint2,mathprint ["=",x,printform],flag)
- if flag='letPrint2 then print printform
- if (y:= hasPair("BREAK",y)) and
- (y="all" or MEMQ(x,y) and
- (not MEMQ((PNAME x).(0),'($ _#)) and not GENSYMP x)) then
- break [:bright currentFunction,'"breaks after",:bright x,":= ",
- printform]
- x
-
--- This is the version for use when we have our hands on a function
--- to convert the data into type "Expression"
-
-letPrint3(x,xval,printfn,currentFunction) ==
- $BreakMode:local
- if $letAssoc and
- ((y:= LASSOC(currentFunction,$letAssoc)) or (y:= LASSOC("all",$letAssoc))) then
- if (y="all" or MEMQ(x,y)) and
- not (IS__GENVAR(x) or isSharpVarWithNum(x) or GENSYMP x) then
- $BreakMode:='letPrint2
- flag:=nil
- CATCH('letPrint2,mathprint ["=",x,SPADCALL(xval,printfn)],flag)
- if flag='letPrint2 then print xval
- if (y:= hasPair("BREAK",y)) and
- (y="all" or MEMQ(x,y) and
- (not MEMQ((PNAME x).(0),'($ _#)) and not GENSYMP x)) then
- break [:bright currentFunction,'"breaks after",:bright x,'":= ",
- xval]
- x
-
-getAliasIfTracedMapParameter(x,currentFunction) ==
- isSharpVarWithNum x =>
- aliasList:= get(currentFunction,'alias,$InteractiveFrame) =>
- aliasList.(STRING2PINT_-N(SUBSTRING(PNAME x,1,NIL),1)-1)
- x
-
-getBpiNameIfTracedMap(name) ==
- lmm:= get(name,'localModemap,$InteractiveFrame) =>
- MEMQ(bpiName:= CADAR lmm,_/TRACENAMES) => bpiName
- name
-
-hasPair(key,l) ==
- atom l => nil
- l is [[ =key,:a],:.] => a
- hasPair(key,rest l)
-
-shortenForPrinting val ==
- isDomainOrPackage val => devaluate val
- val
-
-spadTraceAlias(domainId,op,n) ==
- INTERNL(domainId,".",op,",",STRINGIMAGE n)
-
-getOption(opt,l) ==
- y:= ASSOC(opt,l) => rest y
-
-reportSpadTrace(header,[op,sig,n,:t]) ==
- null $traceNoisely => nil
- msg:= [header,'%b,op,":",'%d,rest sig," -> ",first sig," in slot ",n]
- namePart:= nil --(t is (.,.,name,:.) => (" named ",name); NIL)
- tracePart:=
- t is [y,:.] and not null y =>
- (y="all" => ['%b,"all",'%d,"vars"]; [" vars: ",y])
- NIL
- sayBrightly [:msg,:namePart,:tracePart]
-
-orderBySlotNumber l ==
- ASSOCRIGHT orderList [[n,:x] for (x:= [.,.,n,:.]) in l]
-
-_/TRACEREPLY() ==
- null _/TRACENAMES => MAKESTRING '" Nothing is traced."
- for x in _/TRACENAMES repeat
- x is [d,:.] and isDomainOrPackage d =>
- domainList:= [devaluate d,:domainList]
- functionList:= [x,:functionList]
- [:functionList,:domainList,"traced"]
-
-spadReply() ==
- [printName x for x in _/TRACENAMES] where
- printName x ==
- x is [d,:.] and isDomainOrPackage d => devaluate d
- x
-
-spadUntrace(domain,options) ==
- not isDomainOrPackage domain => userError '"bad argument to untrace"
- anyifTrue:= null options
- listOfOperations:= getOption("ops:",options)
- domainId := devaluate domain
- null (pair:= ASSOC(domain,_/TRACENAMES)) =>
- sayMSG ['" No functions in",
- :bright prefix2String domainId,'"are now traced."]
- sigSlotNumberAlist:= rest pair
- for (pair:= [op,sig,n,lv,bpiPointer,traceName,alias]) in sigSlotNumberAlist |
- anyifTrue or MEMQ(op,listOfOperations) repeat
- BPIUNTRACE(traceName,alias)
- RPLAC(first domain.n,bpiPointer)
- RPLAC(CDDDR pair,nil)
- if assocPair:=ASSOC(BPINAME bpiPointer,$letAssoc) then
- $letAssoc := REMOVER($letAssoc,assocPair)
- if null $letAssoc then SETLETPRINTFLAG nil
- newSigSlotNumberAlist:= [x for x in sigSlotNumberAlist | CDDDR x]
- newSigSlotNumberAlist => RPLAC(rest pair,newSigSlotNumberAlist)
- SETQ(_/TRACENAMES,DELASC(domain,_/TRACENAMES))
- spadReply()
-
-prTraceNames() ==
- (for x in _/TRACENAMES repeat PRINT fn x; nil) where
- fn x ==
- x is [d,:t] and isDomainOrPackage d => [devaluate d,:t]
- x
-
-traceReply() ==
- $domains: local:= nil
- $packages: local:= nil
- $constructors: local:= nil
- null _/TRACENAMES =>
- sayMessage '" Nothing is traced now."
- sayBrightly '" "
- for x in _/TRACENAMES repeat
- x is [d,:.] and (isDomainOrPackage d) => addTraceItem d
- atom x =>
- isFunctor x => addTraceItem x
- (IS__GENVAR x =>
- addTraceItem EVAL x; functionList:= [x,:functionList])
- userError '"bad argument to trace"
- functionList:= "append"/[[rassocSub(x,$mapSubNameAlist),'" "]
- for x in functionList | ^isSubForRedundantMapName x]
- if functionList then
- 2 = #functionList =>
- sayMSG [" Function traced: ",:functionList]
- (22 + sayBrightlyLength functionList) <= $LINELENGTH =>
- sayMSG [" Functions traced: ",:functionList]
- sayBrightly " Functions traced:"
- sayBrightly flowSegmentedMsg(functionList,$LINELENGTH,6)
- if $domains then
- displayList:= concat(prefix2String first $domains,
- [:concat('",",'" ",prefix2String x) for x in rest $domains])
- if atom displayList then displayList:= [displayList]
- sayBrightly '" Domains traced: "
- sayBrightly flowSegmentedMsg(displayList,$LINELENGTH,6)
- if $packages then
- displayList:= concat(prefix2String first $packages,
- [:concat(", ",prefix2String x) for x in rest $packages])
- if atom displayList then displayList:= [displayList]
- sayBrightly '" Packages traced: "
- sayBrightly flowSegmentedMsg(displayList,$LINELENGTH,6)
- if $constructors then
- displayList:= concat(abbreviate first $constructors,
- [:concat(", ",abbreviate x) for x in rest $constructors])
- if atom displayList then displayList:= [displayList]
- sayBrightly '" Parameterized constructors traced:"
- sayBrightly flowSegmentedMsg(displayList,$LINELENGTH,6)
-
-addTraceItem d ==
- constructor? d => $constructors:=[d,:$constructors]
- isDomain d => $domains:= [devaluate d,:$domains]
- isDomainOrPackage d => $packages:= [devaluate d,:$packages]
-
-_?t() ==
- null _/TRACENAMES => sayMSG bright '"nothing is traced"
- for x in _/TRACENAMES | atom x and not IS__GENVAR x repeat
- if llm:= get(x,'localModemap,$InteractiveFrame) then
- x:= (LIST (CADAR llm))
- sayMSG ['"Function",:bright rassocSub(x,$mapSubNameAlist),'"traced"]
- for x in _/TRACENAMES | x is [d,:l] and isDomainOrPackage d repeat
- suffix:=
- isDomain d => '"domain"
- '"package"
- sayBrightly ['" Functions traced in ",suffix,'%b,devaluate d,'%d,":"]
- for x in orderBySlotNumber l repeat reportSpadTrace(" ",take(4,x))
- TERPRI()
-
-tracelet(fn,vars) ==
- if GENSYMP fn and stupidIsSpadFunction EVAL fn then
- fn := EVAL fn
- if COMPILED_-FUNCTION_-P fn then fn:=BPINAME fn
- fn = 'Undef => nil
- vars:=
- vars="all" => "all"
- l:= LASSOC(fn,$letAssoc) => union(vars,l)
- vars
- $letAssoc:= [[fn,:vars],:$letAssoc]
- if $letAssoc then SETLETPRINTFLAG true
- $TRACELETFLAG : local := true
- $QuickLet : local := false
- ^MEMQ(fn,$traceletFunctions) and ^IS__GENVAR fn and COMPILED_-FUNCTION_-P SYMBOL_-FUNCTION fn
- and not stupidIsSpadFunction fn and not GENSYMP fn =>
- ($traceletFunctions:= [fn,:$traceletFunctions]; compileBoot fn ;
- $traceletFunctions:= delete(fn,$traceletFunctions) )
-
-breaklet(fn,vars) ==
- --vars is "all" or a list of variables
- --$letAssoc ==> (.. (=fn .. (BREAK . all))) OR (.. (=fn .. (BREAK . vl)))
- if GENSYMP fn and stupidIsSpadFunction EVAL fn then
- fn := EVAL fn
- if COMPILED_-FUNCTION_-P fn then fn:= BPINAME fn
- fn = "Undef" => nil
- fnEntry:= LASSOC(fn,$letAssoc)
- vars:=
- pair:= ASSOC("BREAK",fnEntry) => union(vars,rest pair)
- vars
- $letAssoc:=
- null fnEntry => [[fn,:LIST ["BREAK",:vars]],:$letAssoc]
- pair => (RPLACD(pair,vars); $letAssoc)
- if $letAssoc then SETLETPRINTFLAG true
- $QuickLet:local := false
- ^MEMQ(fn,$traceletFunctions) and not stupidIsSpadFunction fn
- and not GENSYMP fn =>
- $traceletFunctions:= [fn,:$traceletFunctions]
- compileBoot fn
- $traceletFunctions:= delete(fn,$traceletFunctions)
-
-stupidIsSpadFunction fn ==
- -- returns true if the function pname has a semi-colon in it
- -- eventually, this will use isSpadFunction from luke boot
- STRPOS('"_;",PNAME fn,0,NIL)
-
-break msg ==
- condition:= MONITOR_,EVALTRAN(_/BREAKCONDITION,nil)
- -- The next line is to try to deal with some reported cases of unwanted
- -- backtraces appearing, MCD.
- ENABLE_-BACKTRACE(nil)
- EVAL condition =>
- sayBrightly msg
- INTERRUPT()
-
-compileBoot fn == _/D_,1(LIST fn,'(_/COMP),nil,nil)
-
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}