\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"

+++ True if we are translating code written in Old Boot.
$translatingOldBoot := false

AxiomCore::%sysInit() ==
  if cdr ASSOC(Option '"boot", %systemOptions()) = '"old"
  then $translatingOldBoot := true

-- 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_*
   IN_-PACKAGE '"BOOTTRAN"
   $bfClamming:local:=false
   infn:=shoeAddbootIfNec fn
   outfn:=CONCAT(shoeRemovebootIfNec fn,'".",_*LISP_-SOURCE_-FILETYPE_*)
   shoeOpenInputFile(a,infn,shoeClLines(a,infn,[],outfn))
   setCurrentPackage b
   LOAD outfn
 
-- (boot "filename") translates the file "filename.boot"
-- and prints the result at the console
 
BO fn==
     b := _*PACKAGE_*
     IN_-PACKAGE '"BOOTTRAN"
     $GenVarCounter:local := 0
     $bfClamming:local := false
     infn:=shoeAddbootIfNec fn
     shoeOpenInputFile(a,infn,shoeToConsole(a,fn))
     setCurrentPackage 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 [["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]]]

      ConstantDefinition(n, e) =>
        bpPush [["DEFCONSTANT", n, e]]

      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_*
         IN_-PACKAGE '"BOOTTRAN"
         b:=bStreamNull s
         setCurrentPackage 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")

(DEFPARAMETER |$translatingOldBoot| NIL)

(DEFUN |AxiomCore|::|%sysInit| ()
  (PROG ()
    (DECLARE (SPECIAL |$translatingOldBoot|))
    (RETURN
      (COND
        ((EQUAL (CDR (ASSOC (|Option| "boot") (|%systemOptions|)))
                "old")
         (SETQ |$translatingOldBoot| T))))))

(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
               (LET ((|bfVar#1| |lines|) (|line| NIL))
                 (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|))))
               (|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
               (LET ((|bfVar#2| |lines|) (|line| NIL))
                 (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|))))
               (|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*)
        (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|))
        (|setCurrentPackage| |b|)
        (LOAD |outfn|)))))

(DEFUN BO (|fn|)
  (PROG (|$bfClamming| |$GenVarCounter| |infn| |b|)
    (DECLARE (SPECIAL |$bfClamming| |$GenVarCounter|))
    (RETURN
      (PROGN
        (SETQ |b| *PACKAGE*)
        (IN-PACKAGE "BOOTTRAN")
        (SETQ |$GenVarCounter| 0)
        (SETQ |$bfClamming| NIL)
        (SETQ |infn| (|shoeAddbootIfNec| |fn|))
        (|shoeOpenInputFile| |a| |infn| (|shoeToConsole| |a| |fn|))
        (|setCurrentPackage| |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
      (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|)
        (LET ((|bfVar#3| |lines|) (|line| NIL))
          (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|))))
        (|shoeFileLine| " " |fn|)))))

(DEFUN |shoeConsoleLines| (|lines|)
  (PROG ()
    (RETURN
      (PROGN
        (|shoeConsole| " ")
        (LET ((|bfVar#4| |lines|) (|line| NIL))
          (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|))))
        (|shoeConsole| " ")))))

(DEFUN |shoeFileLine| (|x| |stream|)
  (PROG () (RETURN (PROGN (WRITE-LINE |x| |stream|) |x|))))

(DEFUN |shoeFileTrees| (|s| |st|)
  (PROG (|a|)
    (RETURN
      (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
      (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 (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|))))))
               (|ConstantDefinition|
                   (LET ((|n| (CAR |bfVar#6|)) (|e| (CADR |bfVar#6|)))
                     (|bpPush| (LIST (LIST 'DEFCONSTANT |n| |e|)))))
               (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| |$bootUsed| |$bootDefined|))
    (RETURN
      (PROGN
        (|shoeFileLine| "DEFINED and not USED" |stream|)
        (SETQ |a|
              (LET ((|bfVar#8| NIL) (|bfVar#7| (HKEYS |$bootDefined|))
                    (|i| NIL))
                (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|)))))
        (|bootOut| (SSORT |a|) |stream|)
        (|shoeFileLine| "             " |stream|)
        (|shoeFileLine| "DEFINED TWICE" |stream|)
        (|bootOut| (SSORT |$bootDefinedTwice|) |stream|)
        (|shoeFileLine| "             " |stream|)
        (|shoeFileLine| "USED and not DEFINED" |stream|)
        (SETQ |a|
              (LET ((|bfVar#10| NIL) (|bfVar#9| (HKEYS |$bootUsed|))
                    (|i| NIL))
                (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|)))))
        (LET ((|bfVar#11| (SSORT |a|)) (|i| NIL))
          (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|))))))))

(DEFUN |shoeDefUse| (|s|)
  (PROG ()
    (RETURN
      (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 |$bootUsed| |$used| |$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|)
        (LET ((|bfVar#12| |$used|) (|i| NIL))
          (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|))))))))

(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|))
           (LET ((|bfVar#13| |dol|) (|i| NIL))
             (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|))))
           (|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#
         (LET ((|bfVar#14| |y|) (|i| NIL))
           (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|)))))))))

(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
      (LET ((|bfVar#15| |l|) (|i| NIL))
        (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|)))))))

(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|)))
        (LET ((|bfVar#16| |c|) (|i| NIL))
          (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|))))))))

(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|
                         (LET ((|bfVar#17| |lines|) (|line| NIL))
                           (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|)))))
                     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 (LET ((|bfVar#19| NIL)
                          (|bfVar#18| (|shoeDQlines| |dq|))
                          (|line| NIL))
                      (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|)))))
              (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
      (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*)
        (IN-PACKAGE "BOOTTRAN")
        (SETQ |b| (|bStreamNull| |s|))
        (|setCurrentPackage| |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}