aboutsummaryrefslogtreecommitdiff
path: root/src/boot/translator.boot.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot/translator.boot.pamphlet')
-rw-r--r--src/boot/translator.boot.pamphlet1935
1 files changed, 1935 insertions, 0 deletions
diff --git a/src/boot/translator.boot.pamphlet b/src/boot/translator.boot.pamphlet
new file mode 100644
index 00000000..384fdbde
--- /dev/null
+++ b/src/boot/translator.boot.pamphlet
@@ -0,0 +1,1935 @@
+\documentclass{article}
+\usepackage{axiom}
+
+\title{\File{src/boot/translator.boot} Pamphlet}
+\author{The Axiom Team}
+
+\begin{document}
+\maketitle
+
+\begin{abstract}
+This file implement various Boot translaters.
+\end{abstract}
+\eject
+
+\tableofcontents
+\eject
+
+\section{Entry points to this module}
+
+The only entry points to this module are:
+\begin{itemize}
+\item [BOOTTOCL]
+\item [BOOTCLAM]
+\item [BOOTTOCLC]
+\item [BOOTTOMC]
+\item [EVAL-BOOT-FILE]
+\item [BO]
+\item [BOCLAM]
+\item [STOUT]
+\item [STEVAL]
+\item [STTOMC]
+\end{itemize}
+
+Calling other functions defined here, from outside of this module,
+may lead to unpredictable results.
+
+
+We assume that we are translating a file called {\bf ``foo.boot''}
+and expect to generate a file called {\bf ``foo.clisp''}.
+
+\section{BOOTTOCLLINES}
+
+The {\bf BOOTTOCLLINES} function cleans up the function names.
+When called during system build from {\bf BOOTTOCL} the {\bf lines}
+variable has the value {\bf NIL} and the {\bf fn} variable has the
+value {\bf ``foo.boot''}.
+
+The infn variable is the input file name, {\bf ``foo.boot''}.
+
+The outfn variable is the output file name, {\bf ``foo.clisp''}.
+
+Calling {\bf shoeOpenInputFile} will create {\bf ``foo.clisp''} and
+return the string ``foo.clisp PRODUCED''.
+
+<<BOOTTOCLLINES>>=
+BOOTTOCLLINES(lines, fn, outfn)==
+ -- The default floating point number is double-float.
+ SETQ(_*READ_-DEFAULT_-FLOAT_-FORMAT_*, 'DOUBLE_-FLOAT)
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ infn:=shoeAddbootIfNec fn
+ result := shoeOpenInputFile(a,infn,
+ shoeClLines(a,fn,lines,outfn))
+ setCurrentPackage callingPackage
+ result
+
+@
+
+\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>>
+
+module '"boot-translator"
+import '"includer"
+import '"scanner"
+import '"pile"
+import '"parser"
+import '"ast"
+
+)package "BOOTTRAN"
+
+-- Make x, the current package
+setCurrentPackage x ==
+ SETQ(_*PACKAGE_*,x)
+
+-- Compiles the input Lisp file designated by lspFileName.
+shoeCOMPILE_-FILE lspFileName ==
+ COMPILE_-FILE lspFileName
+
+-- (boottocl "filename") translates the file "filename.boot" to
+-- the common lisp file "filename.clisp"
+
+BOOTTOCL(fn, out) ==
+ $bfClamming:local:=false
+ BOOTTOCLLINES(nil,fn, out)
+
+-- (bootclam "filename") translates the file "filename.boot" to
+-- the common lisp file "filename.clisp" , producing, for each function
+-- a hash table to store previously computed values indexed by argument
+-- list.
+
+BOOTCLAM(fn, out) == BOOTCLAMLINES(nil,fn, out)
+
+BOOTCLAMLINES(lines, fn, out) ==
+ $bfClamming:local:=true
+ BOOTTOCLLINES(lines, fn, out)
+
+<<BOOTTOCLLINES>>
+shoeClLines(a,fn,lines,outfn)==
+ if null a
+ then shoeNotFound fn
+ else
+ $GenVarCounter:local := 0
+ shoeOpenOutputFile(stream,outfn,
+ (for line in lines repeat shoeFileLine (line,stream);
+ shoeFileTrees(shoeTransformStream a,stream)))
+ outfn
+
+-- (boottoclc "filename") translates the file "filename.boot" to
+-- the common lisp file "filename.clisp" with the original boot
+-- code as comments
+
+BOOTTOCLC(fn, out)==BOOTTOCLCLINES(nil, fn, out)
+
+BOOTTOCLCLINES(lines, fn, outfn)==
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $bfClamming:local:=false
+ infn:=shoeAddbootIfNec fn
+ result := shoeOpenInputFile(a,infn,
+ shoeClCLines(a,fn,lines,outfn))
+ setCurrentPackage callingPackage
+ result
+
+
+shoeClCLines(a,fn,lines,outfn)==
+ if null a
+ then shoeNotFound fn
+ else
+ $GenVarCounter:local := 0
+ shoeOpenOutputFile(stream,outfn,
+ (for line in lines repeat shoeFileLine (line,stream);
+ shoeFileTrees(shoeTransformToFile(stream,
+ shoeInclude bAddLineNumber(bRgen a,bIgen 0)),stream)))
+ outfn
+
+-- (boottomc "filename") translates the file "filename.boot"
+-- to machine code and loads it one item at a time
+
+BOOTTOMC fn==
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $bfClamming:local:=false
+ $GenVarCounter:local := 0
+ infn:=shoeAddbootIfNec fn
+ result := shoeOpenInputFile(a,infn,shoeMc(a,fn))
+ setCurrentPackage callingPackage
+ result
+
+shoeMc(a,fn)==
+ if null a
+ then shoeNotFound fn
+ else
+ shoePCompileTrees shoeTransformStream a
+ shoeConsole CONCAT(fn,'" COMPILED AND LOADED")
+
+EVAL_-BOOT_-FILE fn ==
+ b:=PACKAGE_-NAME _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $bfClamming:local:=false
+ infn:=shoeAddbootIfNec fn
+ outfn:=CONCAT(shoeRemovebootIfNec fn,'".",_*LISP_-SOURCE_-FILETYPE_*)
+ shoeOpenInputFile(a,infn,shoeClLines(a,infn,[],outfn))
+ IN_-PACKAGE b
+ LOAD outfn
+
+-- (boot "filename") translates the file "filename.boot"
+-- and prints the result at the console
+
+BO fn==
+ b:=PACKAGE_-NAME _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $GenVarCounter:local := 0
+ $bfClamming:local := false
+ infn:=shoeAddbootIfNec fn
+ shoeOpenInputFile(a,infn,shoeToConsole(a,fn))
+ IN_-PACKAGE b
+
+BOCLAM fn==
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $GenVarCounter:local := 0
+ $bfClamming:local := true
+ infn:=shoeAddbootIfNec fn
+ result := shoeOpenInputFile(a,infn,shoeToConsole(a,fn))
+ setCurrentPackage callingPackage
+ result
+
+shoeToConsole(a,fn)==
+ if null a
+ then shoeNotFound fn
+ else
+ shoeConsoleTrees shoeTransformToConsole
+ shoeInclude bAddLineNumber(bRgen a,bIgen 0)
+
+-- (stout "string") translates the string "string"
+-- and prints the result at the console
+
+STOUT string== PSTOUT [string]
+-- $GenVarCounter:local := 0
+-- $bfClamming:local:=false
+-- shoeConsoleTrees shoeTransformString [string]
+
+STEVAL string==
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $GenVarCounter:local := 0
+ $bfClamming:local:=false
+ a:= shoeTransformString [string]
+ result :=
+ bStreamPackageNull a => nil
+ fn:=stripm(CAR a,_*PACKAGE_*,FIND_-PACKAGE '"BOOTTRAN")
+ EVAL fn
+ setCurrentPackage callingPackage
+ result
+
+-- (sttomc "string") translates the string "string"
+-- to common lisp, and compiles it.
+
+STTOMC string==
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $GenVarCounter:local := 0
+ $bfClamming:local:=false
+ a:= shoeTransformString [string]
+ result :=
+ bStreamPackageNull a => nil
+ shoePCompile car a
+ setCurrentPackage callingPackage
+ result
+
+
+shoeCompileTrees s==
+ while not bStreamNull s repeat
+ shoeCompile car s
+ s:=cdr s
+
+shoeCompile fn==
+ fn is ['DEFUN,name,bv,:body]=>
+ COMPILE (name,['LAMBDA,bv,:body])
+ EVAL fn
+
+shoeTransform str==
+ bNext(function shoeTreeConstruct,
+ bNext(function shoePileInsert,
+ bNext(function shoeLineToks, str)))
+
+shoeTransformString s==
+ shoeTransform shoeInclude bAddLineNumber(s,bIgen 0)
+shoeTransformStream s==shoeTransformString bRgen s
+-- shoeTransform shoeInclude bAddLineNumber(bRgen s,bIgen 0)
+
+shoeTransformToConsole str==
+ bNext(function shoeConsoleItem,
+ bNext(function shoePileInsert,
+ bNext(function shoeLineToks, str)))
+
+shoeTransformToFile(fn,str)==
+ bFileNext(fn,
+ bNext(function shoePileInsert,
+ bNext(function shoeLineToks, str)))
+
+shoeConsoleItem (str)==
+ dq:=CAR str
+ shoeConsoleLines shoeDQlines dq
+ cons(shoeParseTrees dq,CDR str)
+
+bFileNext(fn,s)==bDelay(function bFileNext1,[fn,s])
+
+bFileNext1(fn,s)==
+ bStreamNull s=> ["nullstream"]
+ dq:=CAR s
+ shoeFileLines(shoeDQlines dq,fn)
+ bAppend(shoeParseTrees dq,bFileNext(fn,cdr s))
+
+shoeParseTrees dq==
+ toklist := dqToList dq
+ null toklist => []
+ shoeOutParse toklist
+
+shoeTreeConstruct (str)==
+ cons(shoeParseTrees CAR str,CDR str)
+
+shoeDQlines dq==
+ a:= CDAAR shoeLastTokPosn dq
+ b:= CDAAR shoeFirstTokPosn dq
+ streamTake (a-b+1,CAR shoeFirstTokPosn dq)
+
+streamTake(n,s)==
+ if bStreamNull s
+ then nil
+ else if EQL(n,0)
+ then nil
+ else cons(car s,streamTake(n-1,cdr s))
+
+shoeFileLines (lines,fn) ==
+ shoeFileLine( '" ",fn)
+ for line in lines repeat shoeFileLine (shoeAddComment line,fn)
+ shoeFileLine ('" ",fn)
+
+shoeConsoleLines lines ==
+ shoeConsole '" "
+ for line in lines repeat shoeConsole shoeAddComment line
+ shoeConsole '" "
+
+shoeFileLine(x, stream) ==
+ WRITE_-LINE(x, stream)
+ x
+
+shoeFileTrees(s,st)==
+ while not bStreamNull s repeat
+ a:=CAR s
+ if EQCAR (a,"+LINE")
+ then shoeFileLine(CADR a,st)
+ else
+ REALLYPRETTYPRINT(a,st)
+ TERPRI st
+ s:=CDR s
+
+
+shoePPtoFile(x, stream) ==
+ SHOENOTPRETTYPRINT(x, stream)
+ x
+
+shoeConsoleTrees s ==
+ while not bStreamPackageNull s repeat
+-- while not bStreamNull s repeat
+ fn:=stripm(CAR s,_*PACKAGE_*,FIND_-PACKAGE '"BOOTTRAN")
+ REALLYPRETTYPRINT fn
+ s:=CDR s
+
+shoeAddComment l== CONCAT('"; ",CAR l)
+
+shoeOutParse stream ==
+ $inputStream :local:= stream
+ $stack:local :=nil
+ $stok:local := nil
+ $ttok:local := nil
+ $op:local :=nil
+ $wheredefs:local:=nil
+ $typings:local:=nil
+ $returns:local :=nil
+ $bpCount:local:=0
+ $bpParenCount:local:=0
+ bpFirstTok()
+ found:=CATCH("TRAPPOINT",bpOutItem())
+ if found="TRAPPED"
+ then nil
+ else if not bStreamNull $inputStream
+ then
+ bpGeneralErrorHere()
+ nil
+ else if null $stack
+ then
+ bpGeneralErrorHere()
+ nil
+ else CAR $stack
+
+bpOutItem()==
+ bpComma() or bpTrap()
+ b:=bpPop1()
+ EQCAR(b,"TUPLE")=> bpPush cdr b
+ EQCAR(b,"+LINE")=> bpPush [ b ]
+ b is ["L%T",l,r] and IDENTP l =>
+ bpPush [shoeEVALANDFILEACTQ ["DEFPARAMETER",l,r]]
+ case b of
+ Module(m) => bpPush [shoeCompileTimeEvaluation ["PROVIDE", m]]
+ Import(m) => bpPush [["IMPORT-MODULE", m]]
+ TypeAlias(t, args, rhs) => bpPush [["DEFTYPE", t, args, ["QUOTE", rhs]]]
+ otherwise =>
+ b:=shoeCompTran ["LAMBDA",["x"],b]
+ bpPush [shoeEVALANDFILEACTQ CADDR b]
+
+--shoeStartsAt (sz,name,stream)==
+-- bStreamNull stream => ['nullstream]
+-- a:=CAAR stream
+-- if #a<sz
+-- then shoeStartsAt(sz,name,CDR stream)
+-- else if SUBSTRING(a,0,sz)=name and (#a>sz and not shoeIdChar(a.sz))
+-- then stream
+-- else shoeStartsAt(sz,name,CDR stream)
+
+--FC(name,fn)==
+-- $bfClamming:local:=false
+-- $GenVarCounter:local := 0
+-- infn:=shoeAddbootIfNec fn
+-- shoeOpenInputFile(a,infn,shoeFindName(fn,name, a))
+
+--shoeFindName(fn,name,a)==
+-- shoeFindAndDoSomething(FUNCTION shoeCompile,fn,name,a)
+--shoeTransform1 str==
+-- bNext(function shoeTreeConstruct,
+-- streamTake(1, bNext(function shoePileInsert,
+-- bNext(function shoeLineToks, str))))
+
+--BOOT_-DO_-SOMETHING_-TO_-DEFINITION_-FROM_-FILE(fun,fn,symbol)==
+-- $bfClamming:local:=false
+-- infn:=shoeAddbootIfNec NAMESTRING fn
+-- name:=PNAME symbol
+-- shoeOpenInputFile(a,infn,shoeFindAndDoSomething(fun,fn,name, a))
+
+--shoeFindAndDoSomething(fun,fn,name,a)==
+-- if null a
+-- then shoeNotFound fn
+-- else
+-- b:=shoeStartsAt(#name,name, shoeInclude
+-- bAddLineNumber(bRgen a,bIgen 0))
+-- if bStreamNull b
+-- then shoeConsole CONCAT (name,'" not found in ",fn)
+-- else
+-- $GenVarCounter:local := 0
+-- shoeLoop(fun,shoeTransform1 b)
+
+--BOOT_-COMPILE_-DEFINITION_-FROM_-FILE(fn,symbol)==
+-- BOOT_-DO_-SOMETHING_-TO_-DEFINITION_-FROM_-FILE
+-- (FUNCTION shoeCompile,fn,symbol)
+
+--BOOT_-EVAL_-DEFINITION_-FROM_-FILE(fn,symbol)==
+-- BOOT_-DO_-SOMETHING_-TO_-DEFINITION_-FROM_-FILE
+-- (FUNCTION EVAL,fn,symbol)
+
+--BOOT_-PRINT_-DEFINITION_-FROM_-FILE(fn,symbol)==
+-- BOOT_-DO_-SOMETHING_-TO_-DEFINITION_-FROM_-FILE
+-- (FUNCTION REALLYPRETTYPRINT,fn,symbol)
+
+--shoeLoop(fun, s)==
+-- while not bStreamNull s repeat
+-- FUNCALL(fun, car s)
+-- s:=cdr s
+
+shoeAddbootIfNec s==shoeAddStringIfNec('".boot",s)
+
+shoeRemovebootIfNec s==shoeRemoveStringIfNec('".boot",s)
+shoeAddStringIfNec(str,s)==
+ a:=STRPOS(str,s,0,nil)
+ if null a
+ then CONCAT(s,str)
+ else s
+
+shoeRemoveStringIfNec(str,s)==
+ a:=STRPOS(str,s,0,nil)
+ if null a
+ then s
+ else SUBSTRING(s,0,a)
+
+-- DEFUSE prints the definitions not used and the words used and
+-- not defined in the input file and common lisp.
+
+DEFUSE fn==
+ infn:=CONCAT(fn,'".boot")
+ shoeOpenInputFile(a,infn,shoeDfu(a,fn))
+
+shoeDfu(a,fn)==
+ if null a
+ then shoeNotFound fn
+ else
+ $lispWordTable:local :=MAKE_-HASHTABLE ("EQ")
+ DO_-SYMBOLS(i(FIND_-PACKAGE "LISP"),HPUT($lispWordTable,i,true))
+ $bootDefined:local :=MAKE_-HASHTABLE "EQ"
+ $bootUsed:local :=MAKE_-HASHTABLE "EQ"
+ $bootDefinedTwice:local:=nil
+ $GenVarCounter:local :=0
+ $bfClamming:local:=false
+ shoeDefUse shoeTransformStream a
+ out:=CONCAT(fn,'".defuse")
+ shoeOpenOutputFile(stream,out,shoeReport stream)
+ out
+
+shoeReport stream==
+ shoeFileLine('"DEFINED and not USED",stream)
+ a:=[i for i in HKEYS $bootDefined | not GETHASH(i,$bootUsed)]
+ bootOut(SSORT a,stream)
+ shoeFileLine('" ",stream)
+ shoeFileLine('"DEFINED TWICE",stream)
+ bootOut(SSORT $bootDefinedTwice,stream)
+ shoeFileLine('" ",stream)
+ shoeFileLine('"USED and not DEFINED",stream)
+ a:=[i for i in HKEYS $bootUsed |
+ not GETHASH(i,$bootDefined)]
+ for i in SSORT a repeat
+ b:=CONCAT(PNAME i,'" is used in ")
+ bootOutLines( SSORT GETHASH(i,$bootUsed),stream,b)
+
+shoeDefUse(s)==
+ while not bStreamPackageNull s repeat
+ defuse([],CAR s)
+ s:=CDR s
+
+defuse(e,x)==
+ x:=stripm(x,_*PACKAGE_*,FIND_-PACKAGE '"BOOTTRAN")
+ $used:local:=nil
+ [nee,niens]:=
+ x is ['DEFUN,name,bv,:body] => [name,['LAMBDA,bv,:body]]
+ x is ['DEFMACRO,name,bv,:body] => [name,['LAMBDA,bv,:body]]
+ x is ["EVAL_-WHEN",.,["SETQ",id,exp]]=>[id,exp]
+ x is ["SETQ",id,exp]=>[id,exp]
+ ["TOP-LEVEL", x]
+ if GETHASH(nee,$bootDefined)
+ then
+ $bootDefinedTwice:=
+ nee="TOP-LEVEL"=> $bootDefinedTwice
+ cons(nee,$bootDefinedTwice)
+ else HPUT($bootDefined,nee,true)
+ defuse1 (e,niens)
+ for i in $used repeat
+ HPUT($bootUsed,i,cons(nee,GETHASH(i,$bootUsed)))
+
+defuse1(e,y)==
+ ATOM y =>
+ IDENTP y =>
+ $used:=
+ MEMQ(y,e)=>$used
+ MEMQ(y,$used)=>$used
+ defusebuiltin y =>$used
+ UNION([y],$used)
+ []
+ y is ["LAMBDA",a,:b]=> defuse1 (append(unfluidlist a,e),b)
+ y is ["PROG",a,:b]=>
+ [dol,ndol]:=defSeparate a
+ for i in dol repeat
+ HPUT($bootDefined,i,true)
+ defuse1 (append(ndol,e),b)
+ y is ["QUOTE",:a] => []
+ y is ["+LINE",:a] => []
+ for i in y repeat defuse1(e,i)
+
+defSeparate x==
+ if null x
+ then [[],[]]
+ else
+ f:=car x
+ [x1,x2]:=defSeparate cdr x
+ if bfBeginsDollar f
+ then [cons(f,x1),x2]
+ else [x1,cons(f,x2)]
+unfluidlist x==
+ NULL x => []
+ ATOM x=> [x]
+ x is ["&REST",y]=> [y]
+ cons(car x,unfluidlist cdr x)
+
+defusebuiltin x== GETHASH(x,$lispWordTable)
+
+bootOut (l,outfn)==
+ for i in l repeat shoeFileLine (CONCAT ('" ",PNAME i),outfn)
+
+CLESSP(s1,s2)==not(SHOEGREATERP(s1,s2))
+SSORT l == SORT(l,function CLESSP)
+
+bootOutLines(l,outfn,s)==
+ if null l
+ then shoeFileLine(s,outfn)
+ else
+ a:=PNAME car l
+ if #s +#a > 70
+ then
+ shoeFileLine(s,outfn)
+ bootOutLines(l,outfn,'" ")
+ else bootOutLines(cdr l,outfn,CONCAT(s,'" ",a))
+
+
+-- (xref "fn") produces a cross reference listing in "fn.xref"
+-- It contains each name
+-- used in "fn.boot", together with a list of functions that use it.
+
+XREF fn==
+ infn:=CONCAT(fn,'".boot")
+ shoeOpenInputFile(a,infn,shoeXref(a,fn))
+
+shoeXref(a,fn)==
+ if null a
+ then shoeNotFound fn
+ else
+ $lispWordTable:local :=MAKE_-HASHTABLE ("EQ")
+ DO_-SYMBOLS(i(FIND_-PACKAGE "LISP"),HPUT($lispWordTable,i,true))
+ $bootDefined:local :=MAKE_-HASHTABLE "EQ"
+ $bootUsed:local :=MAKE_-HASHTABLE "EQ"
+ $GenVarCounter:local :=0
+ $bfClamming:local:=false
+ shoeDefUse shoeTransformStream a
+ out:=CONCAT(fn,'".xref")
+ shoeOpenOutputFile(stream,out,shoeXReport stream)
+ out
+
+
+shoeXReport stream==
+ shoeFileLine('"USED and where DEFINED",stream)
+ c:=SSORT HKEYS $bootUsed
+ for i in c repeat
+ a:=CONCAT(PNAME i,'" is used in ")
+ bootOutLines( SSORT GETHASH(i,$bootUsed),stream,a)
+
+--FC (name,fn)== shoeGeneralFC(function BOOT,name,fn)
+
+FBO (name,fn)== shoeGeneralFC(function BO,name,fn)
+
+FEV(name,fn)== shoeGeneralFC(function EVAL_-BOOT_-FILE,name,fn)
+
+shoeGeneralFC(f,name,fn)==
+ $bfClamming:local:=false
+ $GenVarCounter:local := 0
+ infn:=shoeAddbootIfNec fn
+ a:= shoeOpenInputFile(a,infn,shoeFindName2(fn,name, a))
+ filename:= if # name > 8 then SUBSTRING(name,0,8) else name
+ a => FUNCALL(f, CONCAT('"/tmp/",filename))
+ nil
+
+shoeFindName2(fn,name,a)==
+ lines:=shoeFindLines(fn,name,a)
+ lines =>
+ filename:= if # name > 8 then SUBSTRING(name,0,8) else name
+ filename := CONCAT ('"/tmp/",filename,'".boot")
+ shoeOpenOutputFile(stream, filename,
+ for line in lines repeat shoeFileLine (line,stream))
+ true
+ false
+
+shoeTransform2 str==
+ bNext(function shoeItem,
+ streamTake(1, bNext(function shoePileInsert,
+ bNext(function shoeLineToks, str))))
+
+shoeItem (str)==
+ dq:=CAR str
+ cons([[CAR line for line in shoeDQlines dq]],CDR str)
+
+--shoeLines lines == [CAR line for line in lines]
+
+--shoeFindAndDoSomething2(fun,fn,name,a)==
+-- if null a
+-- then shoeNotFound fn
+-- else
+-- [lines,b]:=shoePackageStartsAt([],#name,name, shoeInclude
+-- bAddLineNumber(bRgen a,bIgen 0))
+-- if bStreamNull b
+-- then
+-- shoeConsole CONCAT (name,'" not found in ",fn)
+-- []
+-- else
+-- if null lines
+-- then shoeConsole '")package not found"
+-- $GenVarCounter:local := 0
+-- shoeLoopPackage(fun,shoeTransform2 b,lines)
+
+--shoeLoopPackage(fun, s,lines)==
+-- while not bStreamNull s repeat
+-- FUNCALL(fun, append (reverse lines,car s))
+-- s:=cdr s
+-- true
+stripm (x,pk,bt)==
+ ATOM x =>
+ IDENTP x =>
+ SYMBOL_-PACKAGE x = bt => INTERN(PNAME x,pk)
+ x
+ x
+ CONS(stripm(CAR x,pk,bt),stripm(CDR x,pk,bt))
+
+shoePCompile fn==
+ fn:=stripm(fn,_*PACKAGE_*,FIND_-PACKAGE '"BOOTTRAN")
+ fn is ['DEFUN,name,bv,:body]=>
+ COMPILE (name,['LAMBDA,bv,:body])
+ EVAL fn
+
+FC(name,fn)==
+ $bfClamming:local:=false
+ $GenVarCounter:local := 0
+ infn:=shoeAddbootIfNec fn
+ shoeOpenInputFile(a,infn,shoeFindName(fn,name, a))
+
+shoeFindName(fn,name,a)==
+ lines:=shoeFindLines(fn,name,a)
+ shoePCompileTrees shoeTransformString lines
+
+shoePCompileTrees s==
+ while not bStreamPackageNull s repeat
+ REALLYPRETTYPRINT shoePCompile car s
+ s:=cdr s
+
+bStreamPackageNull s==
+ a:=PACKAGE_-NAME _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ b:=bStreamNull s
+ IN_-PACKAGE a
+ b
+
+PSTTOMC string==
+ $GenVarCounter:local := 0
+ $bfClamming:local:=false
+ shoePCompileTrees shoeTransformString string
+
+BOOTLOOP ()==
+ a:=READ_-LINE()
+ #a=0=>
+ WRITE_-LINE '"Boot Loop; to exit type ] "
+ BOOTLOOP()
+ b:=shoePrefix? ('")console",a)
+ b =>
+ stream:= _*TERMINAL_-IO_*
+ PSTTOMC bRgen stream
+ BOOTLOOP()
+ a.0='"]".0 => nil
+ PSTTOMC [a]
+ BOOTLOOP()
+
+BOOTPO ()==
+ a:=READ_-LINE()
+ #a=0=>
+ WRITE_-LINE '"Boot Loop; to exit type ] "
+ BOOTPO()
+ b:=shoePrefix? ('")console",a)
+ b =>
+ stream:= _*TERMINAL_-IO_*
+ PSTOUT bRgen stream
+ BOOTPO()
+ a.0='"]".0 => nil
+ PSTOUT [a]
+ BOOTPO()
+
+PSTOUT string==
+ callingPackage := _*PACKAGE_*
+ IN_-PACKAGE '"BOOTTRAN"
+ $GenVarCounter:local := 0
+ $bfClamming:local:=false
+ result := shoeConsoleTrees shoeTransformString string
+ setCurrentPackage callingPackage
+ result
+
+
+defaultBootToLispFile file ==
+ CONCAT(shoeRemovebootIfNec file,'".clisp")
+
+translateBootFile(progname, options, file) ==
+ outFile := getOutputPathname(options, defaultBootToLispFile file)
+ BOOTTOCL(file, ENOUGH_-NAMESTRING outFile)
+
+compileBootHandler(progname, options, file) ==
+ intFile := BOOTTOCL(file, defaultBootToLispFile file)
+ intFile =>
+ objFile := compileLispHandler(progname, options, intFile)
+ DELETE_-FILE intFile
+ objFile
+ nil
+
+associateRequestWithFileType(Option '"translate", '"boot",
+ function translateBootFile)
+associateRequestWithFileType(Option '"compile", '"boot",
+ function compileBootHandler)
+@
+
+<<translator.clisp>>=
+(EVAL-WHEN (:COMPILE-TOPLEVEL) (PROVIDE "boot-translator"))
+
+(IMPORT-MODULE "includer")
+
+(IMPORT-MODULE "scanner")
+
+(IMPORT-MODULE "pile")
+
+(IMPORT-MODULE "parser")
+
+(IMPORT-MODULE "ast")
+
+(IN-PACKAGE "BOOTTRAN")
+
+(DEFUN |setCurrentPackage| (|x|)
+ (PROG () (RETURN (SETQ *PACKAGE* |x|))))
+
+(DEFUN |shoeCOMPILE-FILE| (|lspFileName|)
+ (PROG () (RETURN (COMPILE-FILE |lspFileName|))))
+
+(DEFUN BOOTTOCL (|fn| |out|)
+ (PROG (|$bfClamming|)
+ (DECLARE (SPECIAL |$bfClamming|))
+ (RETURN
+ (PROGN (SETQ |$bfClamming| NIL) (BOOTTOCLLINES NIL |fn| |out|)))))
+
+(DEFUN BOOTCLAM (|fn| |out|)
+ (PROG () (RETURN (BOOTCLAMLINES NIL |fn| |out|))))
+
+(DEFUN BOOTCLAMLINES (|lines| |fn| |out|)
+ (PROG (|$bfClamming|)
+ (DECLARE (SPECIAL |$bfClamming|))
+ (RETURN
+ (PROGN
+ (SETQ |$bfClamming| T)
+ (BOOTTOCLLINES |lines| |fn| |out|)))))
+
+(DEFUN BOOTTOCLLINES (|lines| |fn| |outfn|)
+ (PROG (|result| |infn| |callingPackage|)
+ (RETURN
+ (PROGN
+ (SETQ *READ-DEFAULT-FLOAT-FORMAT* 'DOUBLE-FLOAT)
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (SETQ |result|
+ (|shoeOpenInputFile| |a| |infn|
+ (|shoeClLines| |a| |fn| |lines| |outfn|)))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN |shoeClLines| (|a| |fn| |lines| |outfn|)
+ (PROG (|$GenVarCounter|)
+ (DECLARE (SPECIAL |$GenVarCounter|))
+ (RETURN
+ (COND
+ ((NULL |a|) (|shoeNotFound| |fn|))
+ ('T (SETQ |$GenVarCounter| 0)
+ (|shoeOpenOutputFile| |stream| |outfn|
+ (PROGN
+ ((LAMBDA (|bfVar#1| |line|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#1|)
+ (PROGN (SETQ |line| (CAR |bfVar#1|)) NIL))
+ (RETURN NIL))
+ ('T (|shoeFileLine| |line| |stream|)))
+ (SETQ |bfVar#1| (CDR |bfVar#1|))))
+ |lines| NIL)
+ (|shoeFileTrees| (|shoeTransformStream| |a|) |stream|)))
+ |outfn|)))))
+
+(DEFUN BOOTTOCLC (|fn| |out|)
+ (PROG () (RETURN (BOOTTOCLCLINES NIL |fn| |out|))))
+
+(DEFUN BOOTTOCLCLINES (|lines| |fn| |outfn|)
+ (PROG (|$bfClamming| |result| |infn| |callingPackage|)
+ (DECLARE (SPECIAL |$bfClamming|))
+ (RETURN
+ (PROGN
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$bfClamming| NIL)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (SETQ |result|
+ (|shoeOpenInputFile| |a| |infn|
+ (|shoeClCLines| |a| |fn| |lines| |outfn|)))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN |shoeClCLines| (|a| |fn| |lines| |outfn|)
+ (PROG (|$GenVarCounter|)
+ (DECLARE (SPECIAL |$GenVarCounter|))
+ (RETURN
+ (COND
+ ((NULL |a|) (|shoeNotFound| |fn|))
+ ('T (SETQ |$GenVarCounter| 0)
+ (|shoeOpenOutputFile| |stream| |outfn|
+ (PROGN
+ ((LAMBDA (|bfVar#2| |line|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#2|)
+ (PROGN (SETQ |line| (CAR |bfVar#2|)) NIL))
+ (RETURN NIL))
+ ('T (|shoeFileLine| |line| |stream|)))
+ (SETQ |bfVar#2| (CDR |bfVar#2|))))
+ |lines| NIL)
+ (|shoeFileTrees|
+ (|shoeTransformToFile| |stream|
+ (|shoeInclude|
+ (|bAddLineNumber| (|bRgen| |a|) (|bIgen| 0))))
+ |stream|)))
+ |outfn|)))))
+
+(DEFUN BOOTTOMC (|fn|)
+ (PROG (|$GenVarCounter| |$bfClamming| |result| |infn|
+ |callingPackage|)
+ (DECLARE (SPECIAL |$GenVarCounter| |$bfClamming|))
+ (RETURN
+ (PROGN
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$bfClamming| NIL)
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (SETQ |result|
+ (|shoeOpenInputFile| |a| |infn| (|shoeMc| |a| |fn|)))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN |shoeMc| (|a| |fn|)
+ (PROG ()
+ (RETURN
+ (COND
+ ((NULL |a|) (|shoeNotFound| |fn|))
+ ('T (|shoePCompileTrees| (|shoeTransformStream| |a|))
+ (|shoeConsole| (CONCAT |fn| " COMPILED AND LOADED")))))))
+
+(DEFUN EVAL-BOOT-FILE (|fn|)
+ (PROG (|$bfClamming| |outfn| |infn| |b|)
+ (DECLARE (SPECIAL |$bfClamming|))
+ (RETURN
+ (PROGN
+ (SETQ |b| (PACKAGE-NAME *PACKAGE*))
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$bfClamming| NIL)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (SETQ |outfn|
+ (CONCAT (|shoeRemovebootIfNec| |fn|) "."
+ *LISP-SOURCE-FILETYPE*))
+ (|shoeOpenInputFile| |a| |infn|
+ (|shoeClLines| |a| |infn| NIL |outfn|))
+ (IN-PACKAGE |b|)
+ (LOAD |outfn|)))))
+
+(DEFUN BO (|fn|)
+ (PROG (|$bfClamming| |$GenVarCounter| |infn| |b|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
+ (RETURN
+ (PROGN
+ (SETQ |b| (PACKAGE-NAME *PACKAGE*))
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| NIL)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (|shoeOpenInputFile| |a| |infn| (|shoeToConsole| |a| |fn|))
+ (IN-PACKAGE |b|)))))
+
+(DEFUN BOCLAM (|fn|)
+ (PROG (|$bfClamming| |$GenVarCounter| |result| |infn|
+ |callingPackage|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
+ (RETURN
+ (PROGN
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| T)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (SETQ |result|
+ (|shoeOpenInputFile| |a| |infn|
+ (|shoeToConsole| |a| |fn|)))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN |shoeToConsole| (|a| |fn|)
+ (PROG ()
+ (RETURN
+ (COND
+ ((NULL |a|) (|shoeNotFound| |fn|))
+ ('T
+ (|shoeConsoleTrees|
+ (|shoeTransformToConsole|
+ (|shoeInclude|
+ (|bAddLineNumber| (|bRgen| |a|) (|bIgen| 0))))))))))
+
+(DEFUN STOUT (|string|) (PROG () (RETURN (PSTOUT (LIST |string|)))))
+
+(DEFUN STEVAL (|string|)
+ (PROG (|$bfClamming| |$GenVarCounter| |result| |fn| |a|
+ |callingPackage|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
+ (RETURN
+ (PROGN
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| NIL)
+ (SETQ |a| (|shoeTransformString| (LIST |string|)))
+ (SETQ |result|
+ (COND
+ ((|bStreamPackageNull| |a|) NIL)
+ ('T
+ (PROGN
+ (SETQ |fn|
+ (|stripm| (CAR |a|) *PACKAGE*
+ (FIND-PACKAGE "BOOTTRAN")))
+ (EVAL |fn|)))))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN STTOMC (|string|)
+ (PROG (|$bfClamming| |$GenVarCounter| |result| |a| |callingPackage|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
+ (RETURN
+ (PROGN
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| NIL)
+ (SETQ |a| (|shoeTransformString| (LIST |string|)))
+ (SETQ |result|
+ (COND
+ ((|bStreamPackageNull| |a|) NIL)
+ ('T (|shoePCompile| (CAR |a|)))))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN |shoeCompileTrees| (|s|)
+ (PROG ()
+ (RETURN
+ ((LAMBDA ()
+ (LOOP
+ (COND
+ ((|bStreamNull| |s|) (RETURN NIL))
+ ('T
+ (PROGN (|shoeCompile| (CAR |s|)) (SETQ |s| (CDR |s|)))))))))))
+
+(DEFUN |shoeCompile| (|fn|)
+ (PROG (|body| |bv| |ISTMP#2| |name| |ISTMP#1|)
+ (RETURN
+ (COND
+ ((AND (CONSP |fn|) (EQ (CAR |fn|) 'DEFUN)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |fn|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |name| (CAR |ISTMP#1|))
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (PROGN
+ (SETQ |bv| (CAR |ISTMP#2|))
+ (SETQ |body| (CDR |ISTMP#2|))
+ 'T))))))
+ (COMPILE |name| (CONS 'LAMBDA (CONS |bv| |body|))))
+ ('T (EVAL |fn|))))))
+
+(DEFUN |shoeTransform| (|str|)
+ (PROG ()
+ (RETURN
+ (|bNext| #'|shoeTreeConstruct|
+ (|bNext| #'|shoePileInsert|
+ (|bNext| #'|shoeLineToks| |str|))))))
+
+(DEFUN |shoeTransformString| (|s|)
+ (PROG ()
+ (RETURN
+ (|shoeTransform|
+ (|shoeInclude| (|bAddLineNumber| |s| (|bIgen| 0)))))))
+
+(DEFUN |shoeTransformStream| (|s|)
+ (PROG () (RETURN (|shoeTransformString| (|bRgen| |s|)))))
+
+(DEFUN |shoeTransformToConsole| (|str|)
+ (PROG ()
+ (RETURN
+ (|bNext| #'|shoeConsoleItem|
+ (|bNext| #'|shoePileInsert|
+ (|bNext| #'|shoeLineToks| |str|))))))
+
+(DEFUN |shoeTransformToFile| (|fn| |str|)
+ (PROG ()
+ (RETURN
+ (|bFileNext| |fn|
+ (|bNext| #'|shoePileInsert| (|bNext| #'|shoeLineToks| |str|))))))
+
+(DEFUN |shoeConsoleItem| (|str|)
+ (PROG (|dq|)
+ (RETURN
+ (PROGN
+ (SETQ |dq| (CAR |str|))
+ (|shoeConsoleLines| (|shoeDQlines| |dq|))
+ (CONS (|shoeParseTrees| |dq|) (CDR |str|))))))
+
+(DEFUN |bFileNext| (|fn| |s|)
+ (PROG () (RETURN (|bDelay| #'|bFileNext1| (LIST |fn| |s|)))))
+
+(DEFUN |bFileNext1| (|fn| |s|)
+ (PROG (|dq|)
+ (RETURN
+ (COND
+ ((|bStreamNull| |s|) (LIST '|nullstream|))
+ ('T
+ (PROGN
+ (SETQ |dq| (CAR |s|))
+ (|shoeFileLines| (|shoeDQlines| |dq|) |fn|)
+ (|bAppend| (|shoeParseTrees| |dq|)
+ (|bFileNext| |fn| (CDR |s|)))))))))
+
+(DEFUN |shoeParseTrees| (|dq|)
+ (PROG (|toklist|)
+ (RETURN
+ (PROGN
+ (SETQ |toklist| (|dqToList| |dq|))
+ (COND ((NULL |toklist|) NIL) ('T (|shoeOutParse| |toklist|)))))))
+
+(DEFUN |shoeTreeConstruct| (|str|)
+ (PROG () (RETURN (CONS (|shoeParseTrees| (CAR |str|)) (CDR |str|)))))
+
+(DEFUN |shoeDQlines| (|dq|)
+ (PROG (|b| |a|)
+ (RETURN
+ (PROGN
+ (SETQ |a| (CDAAR (|shoeLastTokPosn| |dq|)))
+ (SETQ |b| (CDAAR (|shoeFirstTokPosn| |dq|)))
+ (|streamTake| (+ (- |a| |b|) 1)
+ (CAR (|shoeFirstTokPosn| |dq|)))))))
+
+(DEFUN |streamTake| (|n| |s|)
+ (PROG ()
+ (RETURN
+ (COND
+ ((|bStreamNull| |s|) NIL)
+ ((EQL |n| 0) NIL)
+ ('T (CONS (CAR |s|) (|streamTake| (- |n| 1) (CDR |s|))))))))
+
+(DEFUN |shoeFileLines| (|lines| |fn|)
+ (PROG ()
+ (RETURN
+ (PROGN
+ (|shoeFileLine| " " |fn|)
+ ((LAMBDA (|bfVar#3| |line|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#3|)
+ (PROGN (SETQ |line| (CAR |bfVar#3|)) NIL))
+ (RETURN NIL))
+ ('T (|shoeFileLine| (|shoeAddComment| |line|) |fn|)))
+ (SETQ |bfVar#3| (CDR |bfVar#3|))))
+ |lines| NIL)
+ (|shoeFileLine| " " |fn|)))))
+
+(DEFUN |shoeConsoleLines| (|lines|)
+ (PROG ()
+ (RETURN
+ (PROGN
+ (|shoeConsole| " ")
+ ((LAMBDA (|bfVar#4| |line|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#4|)
+ (PROGN (SETQ |line| (CAR |bfVar#4|)) NIL))
+ (RETURN NIL))
+ ('T (|shoeConsole| (|shoeAddComment| |line|))))
+ (SETQ |bfVar#4| (CDR |bfVar#4|))))
+ |lines| NIL)
+ (|shoeConsole| " ")))))
+
+(DEFUN |shoeFileLine| (|x| |stream|)
+ (PROG () (RETURN (PROGN (WRITE-LINE |x| |stream|) |x|))))
+
+(DEFUN |shoeFileTrees| (|s| |st|)
+ (PROG (|a|)
+ (RETURN
+ ((LAMBDA ()
+ (LOOP
+ (COND
+ ((|bStreamNull| |s|) (RETURN NIL))
+ ('T
+ (PROGN
+ (SETQ |a| (CAR |s|))
+ (COND
+ ((EQCAR |a| '+LINE) (|shoeFileLine| (CADR |a|) |st|))
+ ('T (REALLYPRETTYPRINT |a| |st|) (TERPRI |st|)))
+ (SETQ |s| (CDR |s|)))))))))))
+
+(DEFUN |shoePPtoFile| (|x| |stream|)
+ (PROG () (RETURN (PROGN (SHOENOTPRETTYPRINT |x| |stream|) |x|))))
+
+(DEFUN |shoeConsoleTrees| (|s|)
+ (PROG (|fn|)
+ (RETURN
+ ((LAMBDA ()
+ (LOOP
+ (COND
+ ((|bStreamPackageNull| |s|) (RETURN NIL))
+ ('T
+ (PROGN
+ (SETQ |fn|
+ (|stripm| (CAR |s|) *PACKAGE*
+ (FIND-PACKAGE "BOOTTRAN")))
+ (REALLYPRETTYPRINT |fn|)
+ (SETQ |s| (CDR |s|)))))))))))
+
+(DEFUN |shoeAddComment| (|l|)
+ (PROG () (RETURN (CONCAT "; " (CAR |l|)))))
+
+(DEFUN |shoeOutParse| (|stream|)
+ (PROG (|$bpParenCount| |$bpCount| |$returns| |$typings| |$wheredefs|
+ |$op| |$ttok| |$stok| |$stack| |$inputStream| |found|)
+ (DECLARE (SPECIAL |$bpParenCount| |$bpCount| |$returns| |$typings|
+ |$wheredefs| |$op| |$ttok| |$stok| |$stack|
+ |$inputStream|))
+ (RETURN
+ (PROGN
+ (SETQ |$inputStream| |stream|)
+ (SETQ |$stack| NIL)
+ (SETQ |$stok| NIL)
+ (SETQ |$ttok| NIL)
+ (SETQ |$op| NIL)
+ (SETQ |$wheredefs| NIL)
+ (SETQ |$typings| NIL)
+ (SETQ |$returns| NIL)
+ (SETQ |$bpCount| 0)
+ (SETQ |$bpParenCount| 0)
+ (|bpFirstTok|)
+ (SETQ |found| (CATCH 'TRAPPOINT (|bpOutItem|)))
+ (COND
+ ((EQ |found| 'TRAPPED) NIL)
+ ((NULL (|bStreamNull| |$inputStream|)) (|bpGeneralErrorHere|)
+ NIL)
+ ((NULL |$stack|) (|bpGeneralErrorHere|) NIL)
+ ('T (CAR |$stack|)))))))
+
+(DEFUN |bpOutItem| ()
+ (PROG (|bfVar#6| |bfVar#5| |r| |ISTMP#2| |l| |ISTMP#1| |b|)
+ (RETURN
+ (PROGN
+ (OR (|bpComma|) (|bpTrap|))
+ (SETQ |b| (|bpPop1|))
+ (COND
+ ((EQCAR |b| 'TUPLE) (|bpPush| (CDR |b|)))
+ ((EQCAR |b| '+LINE) (|bpPush| (LIST |b|)))
+ ((AND (CONSP |b|) (EQ (CAR |b|) 'L%T)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |b|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |l| (CAR |ISTMP#1|))
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (EQ (CDR |ISTMP#2|) NIL)
+ (PROGN (SETQ |r| (CAR |ISTMP#2|)) 'T)))))
+ (IDENTP |l|))
+ (|bpPush|
+ (LIST (|shoeEVALANDFILEACTQ|
+ (LIST 'DEFPARAMETER |l| |r|)))))
+ ('T
+ (PROGN
+ (SETQ |bfVar#5| |b|)
+ (SETQ |bfVar#6| (CDR |bfVar#5|))
+ (CASE (CAR |bfVar#5|)
+ (|Module|
+ (LET ((|m| (CAR |bfVar#6|)))
+ (|bpPush|
+ (LIST (|shoeCompileTimeEvaluation|
+ (LIST 'PROVIDE |m|))))))
+ (|Import|
+ (LET ((|m| (CAR |bfVar#6|)))
+ (|bpPush|
+ (LIST (LIST 'IMPORT-MODULE |m|)))))
+ (|TypeAlias|
+ (LET ((|t| (CAR |bfVar#6|))
+ (|args| (CADR |bfVar#6|))
+ (|rhs| (CADDR |bfVar#6|)))
+ (|bpPush|
+ (LIST (LIST 'DEFTYPE |t| |args|
+ (LIST 'QUOTE |rhs|))))))
+ (T (PROGN
+ (SETQ |b|
+ (|shoeCompTran|
+ (LIST 'LAMBDA (LIST '|x|) |b|)))
+ (|bpPush|
+ (LIST (|shoeEVALANDFILEACTQ| (CADDR |b|))))))))))))))
+
+(DEFUN |shoeAddbootIfNec| (|s|)
+ (PROG () (RETURN (|shoeAddStringIfNec| ".boot" |s|))))
+
+(DEFUN |shoeRemovebootIfNec| (|s|)
+ (PROG () (RETURN (|shoeRemoveStringIfNec| ".boot" |s|))))
+
+(DEFUN |shoeAddStringIfNec| (|str| |s|)
+ (PROG (|a|)
+ (RETURN
+ (PROGN
+ (SETQ |a| (STRPOS |str| |s| 0 NIL))
+ (COND ((NULL |a|) (CONCAT |s| |str|)) ('T |s|))))))
+
+(DEFUN |shoeRemoveStringIfNec| (|str| |s|)
+ (PROG (|a|)
+ (RETURN
+ (PROGN
+ (SETQ |a| (STRPOS |str| |s| 0 NIL))
+ (COND ((NULL |a|) |s|) ('T (SUBSTRING |s| 0 |a|)))))))
+
+(DEFUN DEFUSE (|fn|)
+ (PROG (|infn|)
+ (RETURN
+ (PROGN
+ (SETQ |infn| (CONCAT |fn| ".boot"))
+ (|shoeOpenInputFile| |a| |infn| (|shoeDfu| |a| |fn|))))))
+
+(DEFUN |shoeDfu| (|a| |fn|)
+ (PROG (|$bfClamming| |$GenVarCounter| |$bootDefinedTwice| |$bootUsed|
+ |$bootDefined| |$lispWordTable| |out|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|
+ |$bootDefinedTwice| |$bootUsed| |$bootDefined|
+ |$lispWordTable|))
+ (RETURN
+ (COND
+ ((NULL |a|) (|shoeNotFound| |fn|))
+ ('T (SETQ |$lispWordTable| (MAKE-HASHTABLE 'EQ))
+ (DO-SYMBOLS (|i| (FIND-PACKAGE 'LISP))
+ (HPUT |$lispWordTable| |i| T))
+ (SETQ |$bootDefined| (MAKE-HASHTABLE 'EQ))
+ (SETQ |$bootUsed| (MAKE-HASHTABLE 'EQ))
+ (SETQ |$bootDefinedTwice| NIL) (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| NIL)
+ (|shoeDefUse| (|shoeTransformStream| |a|))
+ (SETQ |out| (CONCAT |fn| ".defuse"))
+ (|shoeOpenOutputFile| |stream| |out| (|shoeReport| |stream|))
+ |out|)))))
+
+(DEFUN |shoeReport| (|stream|)
+ (PROG (|b| |a|)
+ (DECLARE (SPECIAL |$bootDefinedTwice| |$bootDefined| |$bootUsed|))
+ (RETURN
+ (PROGN
+ (|shoeFileLine| "DEFINED and not USED" |stream|)
+ (SETQ |a|
+ ((LAMBDA (|bfVar#8| |bfVar#7| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#7|)
+ (PROGN (SETQ |i| (CAR |bfVar#7|)) NIL))
+ (RETURN (NREVERSE |bfVar#8|)))
+ (#0='T
+ (AND (NULL (GETHASH |i| |$bootUsed|))
+ (SETQ |bfVar#8| (CONS |i| |bfVar#8|)))))
+ (SETQ |bfVar#7| (CDR |bfVar#7|))))
+ NIL (HKEYS |$bootDefined|) NIL))
+ (|bootOut| (SSORT |a|) |stream|)
+ (|shoeFileLine| " " |stream|)
+ (|shoeFileLine| "DEFINED TWICE" |stream|)
+ (|bootOut| (SSORT |$bootDefinedTwice|) |stream|)
+ (|shoeFileLine| " " |stream|)
+ (|shoeFileLine| "USED and not DEFINED" |stream|)
+ (SETQ |a|
+ ((LAMBDA (|bfVar#10| |bfVar#9| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#9|)
+ (PROGN (SETQ |i| (CAR |bfVar#9|)) NIL))
+ (RETURN (NREVERSE |bfVar#10|)))
+ (#0#
+ (AND (NULL (GETHASH |i| |$bootDefined|))
+ (SETQ |bfVar#10| (CONS |i| |bfVar#10|)))))
+ (SETQ |bfVar#9| (CDR |bfVar#9|))))
+ NIL (HKEYS |$bootUsed|) NIL))
+ ((LAMBDA (|bfVar#11| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#11|)
+ (PROGN (SETQ |i| (CAR |bfVar#11|)) NIL))
+ (RETURN NIL))
+ (#0#
+ (PROGN
+ (SETQ |b| (CONCAT (PNAME |i|) " is used in "))
+ (|bootOutLines| (SSORT (GETHASH |i| |$bootUsed|))
+ |stream| |b|))))
+ (SETQ |bfVar#11| (CDR |bfVar#11|))))
+ (SSORT |a|) NIL)))))
+
+(DEFUN |shoeDefUse| (|s|)
+ (PROG ()
+ (RETURN
+ ((LAMBDA ()
+ (LOOP
+ (COND
+ ((|bStreamPackageNull| |s|) (RETURN NIL))
+ ('T (PROGN (|defuse| NIL (CAR |s|)) (SETQ |s| (CDR |s|)))))))))))
+
+(DEFUN |defuse| (|e| |x|)
+ (PROG (|$used| |niens| |nee| |LETTMP#1| |exp| |ISTMP#5| |id|
+ |ISTMP#4| |ISTMP#3| |body| |bv| |ISTMP#2| |name|
+ |ISTMP#1|)
+ (DECLARE (SPECIAL |$used| |$bootUsed| |$bootDefinedTwice|
+ |$bootDefined|))
+ (RETURN
+ (PROGN
+ (SETQ |x| (|stripm| |x| *PACKAGE* (FIND-PACKAGE "BOOTTRAN")))
+ (SETQ |$used| NIL)
+ (SETQ |LETTMP#1|
+ (COND
+ ((AND (CONSP |x|) (EQ (CAR |x|) 'DEFUN)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |x|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |name| (CAR |ISTMP#1|))
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (PROGN
+ (SETQ |bv| (CAR |ISTMP#2|))
+ (SETQ |body| (CDR |ISTMP#2|))
+ #0='T))))))
+ (LIST |name| (CONS 'LAMBDA (CONS |bv| |body|))))
+ ((AND (CONSP |x|) (EQ (CAR |x|) 'DEFMACRO)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |x|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |name| (CAR |ISTMP#1|))
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (PROGN
+ (SETQ |bv| (CAR |ISTMP#2|))
+ (SETQ |body| (CDR |ISTMP#2|))
+ #0#))))))
+ (LIST |name| (CONS 'LAMBDA (CONS |bv| |body|))))
+ ((AND (CONSP |x|) (EQ (CAR |x|) 'EVAL-WHEN)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |x|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (EQ (CDR |ISTMP#2|) NIL)
+ (PROGN
+ (SETQ |ISTMP#3| (CAR |ISTMP#2|))
+ (AND (CONSP |ISTMP#3|)
+ (EQ (CAR |ISTMP#3|) 'SETQ)
+ (PROGN
+ (SETQ |ISTMP#4|
+ (CDR |ISTMP#3|))
+ (AND (CONSP |ISTMP#4|)
+ (PROGN
+ (SETQ |id| (CAR |ISTMP#4|))
+ (SETQ |ISTMP#5|
+ (CDR |ISTMP#4|))
+ (AND (CONSP |ISTMP#5|)
+ (EQ (CDR |ISTMP#5|) NIL)
+ (PROGN
+ (SETQ |exp|
+ (CAR |ISTMP#5|))
+ #0#))))))))))))
+ (LIST |id| |exp|))
+ ((AND (CONSP |x|) (EQ (CAR |x|) 'SETQ)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |x|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |id| (CAR |ISTMP#1|))
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (EQ (CDR |ISTMP#2|) NIL)
+ (PROGN
+ (SETQ |exp| (CAR |ISTMP#2|))
+ #0#))))))
+ (LIST |id| |exp|))
+ (#1='T (LIST 'TOP-LEVEL |x|))))
+ (SETQ |nee| (CAR |LETTMP#1|))
+ (SETQ |niens| (CADR |LETTMP#1|))
+ (COND
+ ((GETHASH |nee| |$bootDefined|)
+ (SETQ |$bootDefinedTwice|
+ (COND
+ ((EQ |nee| 'TOP-LEVEL) |$bootDefinedTwice|)
+ (#1# (CONS |nee| |$bootDefinedTwice|)))))
+ ('T (HPUT |$bootDefined| |nee| T)))
+ (|defuse1| |e| |niens|)
+ ((LAMBDA (|bfVar#12| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#12|)
+ (PROGN (SETQ |i| (CAR |bfVar#12|)) NIL))
+ (RETURN NIL))
+ ('T
+ (HPUT |$bootUsed| |i|
+ (CONS |nee| (GETHASH |i| |$bootUsed|)))))
+ (SETQ |bfVar#12| (CDR |bfVar#12|))))
+ |$used| NIL)))))
+
+(DEFUN |defuse1| (|e| |y|)
+ (PROG (|ndol| |dol| |LETTMP#1| |b| |a| |ISTMP#1|)
+ (DECLARE (SPECIAL |$bootDefined| |$used|))
+ (RETURN
+ (COND
+ ((ATOM |y|)
+ (COND
+ ((IDENTP |y|)
+ (SETQ |$used|
+ (COND
+ ((MEMQ |y| |e|) |$used|)
+ ((MEMQ |y| |$used|) |$used|)
+ ((|defusebuiltin| |y|) |$used|)
+ (#0='T (UNION (LIST |y|) |$used|)))))
+ (#0# NIL)))
+ ((AND (CONSP |y|) (EQ (CAR |y|) 'LAMBDA)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |y|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |a| (CAR |ISTMP#1|))
+ (SETQ |b| (CDR |ISTMP#1|))
+ #1='T))))
+ (|defuse1| (APPEND (|unfluidlist| |a|) |e|) |b|))
+ ((AND (CONSP |y|) (EQ (CAR |y|) 'PROG)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |y|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |a| (CAR |ISTMP#1|))
+ (SETQ |b| (CDR |ISTMP#1|))
+ #1#))))
+ (PROGN
+ (SETQ |LETTMP#1| (|defSeparate| |a|))
+ (SETQ |dol| (CAR |LETTMP#1|))
+ (SETQ |ndol| (CADR |LETTMP#1|))
+ ((LAMBDA (|bfVar#13| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#13|)
+ (PROGN (SETQ |i| (CAR |bfVar#13|)) NIL))
+ (RETURN NIL))
+ (#2='T (HPUT |$bootDefined| |i| T)))
+ (SETQ |bfVar#13| (CDR |bfVar#13|))))
+ |dol| NIL)
+ (|defuse1| (APPEND |ndol| |e|) |b|)))
+ ((AND (CONSP |y|) (EQ (CAR |y|) 'QUOTE)
+ (PROGN (SETQ |a| (CDR |y|)) #1#))
+ NIL)
+ ((AND (CONSP |y|) (EQ (CAR |y|) '+LINE)
+ (PROGN (SETQ |a| (CDR |y|)) #1#))
+ NIL)
+ (#0#
+ ((LAMBDA (|bfVar#14| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#14|)
+ (PROGN (SETQ |i| (CAR |bfVar#14|)) NIL))
+ (RETURN NIL))
+ (#2# (|defuse1| |e| |i|)))
+ (SETQ |bfVar#14| (CDR |bfVar#14|))))
+ |y| NIL))))))
+
+(DEFUN |defSeparate| (|x|)
+ (PROG (|x2| |x1| |LETTMP#1| |f|)
+ (RETURN
+ (COND
+ ((NULL |x|) (LIST NIL NIL))
+ (#0='T (SETQ |f| (CAR |x|))
+ (SETQ |LETTMP#1| (|defSeparate| (CDR |x|)))
+ (SETQ |x1| (CAR |LETTMP#1|)) (SETQ |x2| (CADR |LETTMP#1|))
+ (COND
+ ((|bfBeginsDollar| |f|) (LIST (CONS |f| |x1|) |x2|))
+ (#0# (LIST |x1| (CONS |f| |x2|)))))))))
+
+(DEFUN |unfluidlist| (|x|)
+ (PROG (|y| |ISTMP#1|)
+ (RETURN
+ (COND
+ ((NULL |x|) NIL)
+ ((ATOM |x|) (LIST |x|))
+ ((AND (CONSP |x|) (EQ (CAR |x|) '&REST)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |x|))
+ (AND (CONSP |ISTMP#1|) (EQ (CDR |ISTMP#1|) NIL)
+ (PROGN (SETQ |y| (CAR |ISTMP#1|)) 'T))))
+ (LIST |y|))
+ ('T (CONS (CAR |x|) (|unfluidlist| (CDR |x|))))))))
+
+(DEFUN |defusebuiltin| (|x|)
+ (PROG ()
+ (DECLARE (SPECIAL |$lispWordTable|))
+ (RETURN (GETHASH |x| |$lispWordTable|))))
+
+(DEFUN |bootOut| (|l| |outfn|)
+ (PROG ()
+ (RETURN
+ ((LAMBDA (|bfVar#15| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#15|)
+ (PROGN (SETQ |i| (CAR |bfVar#15|)) NIL))
+ (RETURN NIL))
+ ('T (|shoeFileLine| (CONCAT " " (PNAME |i|)) |outfn|)))
+ (SETQ |bfVar#15| (CDR |bfVar#15|))))
+ |l| NIL))))
+
+(DEFUN CLESSP (|s1| |s2|)
+ (PROG () (RETURN (NULL (SHOEGREATERP |s1| |s2|)))))
+
+(DEFUN SSORT (|l|) (PROG () (RETURN (SORT |l| #'CLESSP))))
+
+(DEFUN |bootOutLines| (|l| |outfn| |s|)
+ (PROG (|a|)
+ (RETURN
+ (COND
+ ((NULL |l|) (|shoeFileLine| |s| |outfn|))
+ (#0='T (SETQ |a| (PNAME (CAR |l|)))
+ (COND
+ ((< 70 (+ (LENGTH |s|) (LENGTH |a|)))
+ (|shoeFileLine| |s| |outfn|)
+ (|bootOutLines| |l| |outfn| " "))
+ (#0#
+ (|bootOutLines| (CDR |l|) |outfn| (CONCAT |s| " " |a|)))))))))
+
+(DEFUN XREF (|fn|)
+ (PROG (|infn|)
+ (RETURN
+ (PROGN
+ (SETQ |infn| (CONCAT |fn| ".boot"))
+ (|shoeOpenInputFile| |a| |infn| (|shoeXref| |a| |fn|))))))
+
+(DEFUN |shoeXref| (|a| |fn|)
+ (PROG (|$bfClamming| |$GenVarCounter| |$bootUsed| |$bootDefined|
+ |$lispWordTable| |out|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter| |$bootUsed|
+ |$bootDefined| |$lispWordTable|))
+ (RETURN
+ (COND
+ ((NULL |a|) (|shoeNotFound| |fn|))
+ ('T (SETQ |$lispWordTable| (MAKE-HASHTABLE 'EQ))
+ (DO-SYMBOLS (|i| (FIND-PACKAGE 'LISP))
+ (HPUT |$lispWordTable| |i| T))
+ (SETQ |$bootDefined| (MAKE-HASHTABLE 'EQ))
+ (SETQ |$bootUsed| (MAKE-HASHTABLE 'EQ))
+ (SETQ |$GenVarCounter| 0) (SETQ |$bfClamming| NIL)
+ (|shoeDefUse| (|shoeTransformStream| |a|))
+ (SETQ |out| (CONCAT |fn| ".xref"))
+ (|shoeOpenOutputFile| |stream| |out| (|shoeXReport| |stream|))
+ |out|)))))
+
+(DEFUN |shoeXReport| (|stream|)
+ (PROG (|a| |c|)
+ (DECLARE (SPECIAL |$bootUsed|))
+ (RETURN
+ (PROGN
+ (|shoeFileLine| "USED and where DEFINED" |stream|)
+ (SETQ |c| (SSORT (HKEYS |$bootUsed|)))
+ ((LAMBDA (|bfVar#16| |i|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#16|)
+ (PROGN (SETQ |i| (CAR |bfVar#16|)) NIL))
+ (RETURN NIL))
+ ('T
+ (PROGN
+ (SETQ |a| (CONCAT (PNAME |i|) " is used in "))
+ (|bootOutLines| (SSORT (GETHASH |i| |$bootUsed|))
+ |stream| |a|))))
+ (SETQ |bfVar#16| (CDR |bfVar#16|))))
+ |c| NIL)))))
+
+(DEFUN FBO (|name| |fn|)
+ (PROG () (RETURN (|shoeGeneralFC| #'BO |name| |fn|))))
+
+(DEFUN FEV (|name| |fn|)
+ (PROG () (RETURN (|shoeGeneralFC| #'EVAL-BOOT-FILE |name| |fn|))))
+
+(DEFUN |shoeGeneralFC| (|f| |name| |fn|)
+ (PROG (|$GenVarCounter| |$bfClamming| |filename| |a| |infn|)
+ (DECLARE (SPECIAL |$GenVarCounter| |$bfClamming|))
+ (RETURN
+ (PROGN
+ (SETQ |$bfClamming| NIL)
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (SETQ |a|
+ (|shoeOpenInputFile| |a| |infn|
+ (|shoeFindName2| |fn| |name| |a|)))
+ (SETQ |filename|
+ (COND
+ ((< 8 (LENGTH |name|)) (SUBSTRING |name| 0 8))
+ ('T |name|)))
+ (COND
+ (|a| (FUNCALL |f| (CONCAT "/tmp/" |filename|)))
+ ('T NIL))))))
+
+(DEFUN |shoeFindName2| (|fn| |name| |a|)
+ (PROG (|filename| |lines|)
+ (RETURN
+ (PROGN
+ (SETQ |lines| (|shoeFindLines| |fn| |name| |a|))
+ (COND
+ (|lines| (PROGN
+ (SETQ |filename|
+ (COND
+ ((< 8 (LENGTH |name|))
+ (SUBSTRING |name| 0 8))
+ ('T |name|)))
+ (SETQ |filename|
+ (CONCAT "/tmp/" |filename| ".boot"))
+ (|shoeOpenOutputFile| |stream| |filename|
+ ((LAMBDA (|bfVar#17| |line|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#17|)
+ (PROGN
+ (SETQ |line| (CAR |bfVar#17|))
+ NIL))
+ (RETURN NIL))
+ ('T (|shoeFileLine| |line| |stream|)))
+ (SETQ |bfVar#17| (CDR |bfVar#17|))))
+ |lines| NIL))
+ T))
+ ('T NIL))))))
+
+(DEFUN |shoeTransform2| (|str|)
+ (PROG ()
+ (RETURN
+ (|bNext| #'|shoeItem|
+ (|streamTake| 1
+ (|bNext| #'|shoePileInsert|
+ (|bNext| #'|shoeLineToks| |str|)))))))
+
+(DEFUN |shoeItem| (|str|)
+ (PROG (|dq|)
+ (RETURN
+ (PROGN
+ (SETQ |dq| (CAR |str|))
+ (CONS (LIST ((LAMBDA (|bfVar#19| |bfVar#18| |line|)
+ (LOOP
+ (COND
+ ((OR (ATOM |bfVar#18|)
+ (PROGN
+ (SETQ |line| (CAR |bfVar#18|))
+ NIL))
+ (RETURN (NREVERSE |bfVar#19|)))
+ ('T
+ (SETQ |bfVar#19|
+ (CONS (CAR |line|) |bfVar#19|))))
+ (SETQ |bfVar#18| (CDR |bfVar#18|))))
+ NIL (|shoeDQlines| |dq|) NIL))
+ (CDR |str|))))))
+
+(DEFUN |stripm| (|x| |pk| |bt|)
+ (PROG ()
+ (RETURN
+ (COND
+ ((ATOM |x|)
+ (COND
+ ((IDENTP |x|)
+ (COND
+ ((EQUAL (SYMBOL-PACKAGE |x|) |bt|)
+ (INTERN (PNAME |x|) |pk|))
+ (#0='T |x|)))
+ (#0# |x|)))
+ (#0#
+ (CONS (|stripm| (CAR |x|) |pk| |bt|)
+ (|stripm| (CDR |x|) |pk| |bt|)))))))
+
+(DEFUN |shoePCompile| (|fn|)
+ (PROG (|body| |bv| |ISTMP#2| |name| |ISTMP#1|)
+ (RETURN
+ (PROGN
+ (SETQ |fn| (|stripm| |fn| *PACKAGE* (FIND-PACKAGE "BOOTTRAN")))
+ (COND
+ ((AND (CONSP |fn|) (EQ (CAR |fn|) 'DEFUN)
+ (PROGN
+ (SETQ |ISTMP#1| (CDR |fn|))
+ (AND (CONSP |ISTMP#1|)
+ (PROGN
+ (SETQ |name| (CAR |ISTMP#1|))
+ (SETQ |ISTMP#2| (CDR |ISTMP#1|))
+ (AND (CONSP |ISTMP#2|)
+ (PROGN
+ (SETQ |bv| (CAR |ISTMP#2|))
+ (SETQ |body| (CDR |ISTMP#2|))
+ 'T))))))
+ (COMPILE |name| (CONS 'LAMBDA (CONS |bv| |body|))))
+ ('T (EVAL |fn|)))))))
+
+(DEFUN FC (|name| |fn|)
+ (PROG (|$GenVarCounter| |$bfClamming| |infn|)
+ (DECLARE (SPECIAL |$GenVarCounter| |$bfClamming|))
+ (RETURN
+ (PROGN
+ (SETQ |$bfClamming| NIL)
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |infn| (|shoeAddbootIfNec| |fn|))
+ (|shoeOpenInputFile| |a| |infn|
+ (|shoeFindName| |fn| |name| |a|))))))
+
+(DEFUN |shoeFindName| (|fn| |name| |a|)
+ (PROG (|lines|)
+ (RETURN
+ (PROGN
+ (SETQ |lines| (|shoeFindLines| |fn| |name| |a|))
+ (|shoePCompileTrees| (|shoeTransformString| |lines|))))))
+
+(DEFUN |shoePCompileTrees| (|s|)
+ (PROG ()
+ (RETURN
+ ((LAMBDA ()
+ (LOOP
+ (COND
+ ((|bStreamPackageNull| |s|) (RETURN NIL))
+ ('T
+ (PROGN
+ (REALLYPRETTYPRINT (|shoePCompile| (CAR |s|)))
+ (SETQ |s| (CDR |s|)))))))))))
+
+(DEFUN |bStreamPackageNull| (|s|)
+ (PROG (|b| |a|)
+ (RETURN
+ (PROGN
+ (SETQ |a| (PACKAGE-NAME *PACKAGE*))
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |b| (|bStreamNull| |s|))
+ (IN-PACKAGE |a|)
+ |b|))))
+
+(DEFUN PSTTOMC (|string|)
+ (PROG (|$bfClamming| |$GenVarCounter|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
+ (RETURN
+ (PROGN
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| NIL)
+ (|shoePCompileTrees| (|shoeTransformString| |string|))))))
+
+(DEFUN BOOTLOOP ()
+ (PROG (|stream| |b| |a|)
+ (RETURN
+ (PROGN
+ (SETQ |a| (READ-LINE))
+ (COND
+ ((EQL (LENGTH |a|) 0)
+ (PROGN
+ (WRITE-LINE "Boot Loop; to exit type ] ")
+ (BOOTLOOP)))
+ (#0='T
+ (PROGN
+ (SETQ |b| (|shoePrefix?| ")console" |a|))
+ (COND
+ (|b| (PROGN
+ (SETQ |stream| *TERMINAL-IO*)
+ (PSTTOMC (|bRgen| |stream|))
+ (BOOTLOOP)))
+ ((EQUAL (ELT |a| 0) (ELT "]" 0)) NIL)
+ (#0# (PROGN (PSTTOMC (LIST |a|)) (BOOTLOOP)))))))))))
+
+(DEFUN BOOTPO ()
+ (PROG (|stream| |b| |a|)
+ (RETURN
+ (PROGN
+ (SETQ |a| (READ-LINE))
+ (COND
+ ((EQL (LENGTH |a|) 0)
+ (PROGN (WRITE-LINE "Boot Loop; to exit type ] ") (BOOTPO)))
+ (#0='T
+ (PROGN
+ (SETQ |b| (|shoePrefix?| ")console" |a|))
+ (COND
+ (|b| (PROGN
+ (SETQ |stream| *TERMINAL-IO*)
+ (PSTOUT (|bRgen| |stream|))
+ (BOOTPO)))
+ ((EQUAL (ELT |a| 0) (ELT "]" 0)) NIL)
+ (#0# (PROGN (PSTOUT (LIST |a|)) (BOOTPO)))))))))))
+
+(DEFUN PSTOUT (|string|)
+ (PROG (|$bfClamming| |$GenVarCounter| |result| |callingPackage|)
+ (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
+ (RETURN
+ (PROGN
+ (SETQ |callingPackage| *PACKAGE*)
+ (IN-PACKAGE "BOOTTRAN")
+ (SETQ |$GenVarCounter| 0)
+ (SETQ |$bfClamming| NIL)
+ (SETQ |result|
+ (|shoeConsoleTrees| (|shoeTransformString| |string|)))
+ (|setCurrentPackage| |callingPackage|)
+ |result|))))
+
+(DEFUN |defaultBootToLispFile| (|file|)
+ (PROG () (RETURN (CONCAT (|shoeRemovebootIfNec| |file|) ".clisp"))))
+
+(DEFUN |translateBootFile| (|progname| |options| |file|)
+ (PROG (|outFile|)
+ (RETURN
+ (PROGN
+ (SETQ |outFile|
+ (|getOutputPathname| |options|
+ (|defaultBootToLispFile| |file|)))
+ (BOOTTOCL |file| (ENOUGH-NAMESTRING |outFile|))))))
+
+(DEFUN |compileBootHandler| (|progname| |options| |file|)
+ (PROG (|objFile| |intFile|)
+ (RETURN
+ (PROGN
+ (SETQ |intFile|
+ (BOOTTOCL |file| (|defaultBootToLispFile| |file|)))
+ (COND
+ (|intFile|
+ (PROGN
+ (SETQ |objFile|
+ (|compileLispHandler| |progname| |options|
+ |intFile|))
+ (DELETE-FILE |intFile|)
+ |objFile|))
+ ('T NIL))))))
+
+(EVAL-WHEN (:EXECUTE :LOAD-TOPLEVEL)
+ (PROG ()
+ (RETURN
+ (|associateRequestWithFileType| (|Option| "translate") "boot"
+ #'|translateBootFile|))))
+
+(EVAL-WHEN (:EXECUTE :LOAD-TOPLEVEL)
+ (PROG ()
+ (RETURN
+ (|associateRequestWithFileType| (|Option| "compile") "boot"
+ #'|compileBootHandler|))))
+
+@
+
+\end{document}