(FILECREATED " 9-Sep-86 15:36:51" {ERIS}<LISPCORE>BVM>CMLCOMPILE.;1 33746  

      changes to:  (FNS COMPILE-FILE COMPILE-FILE-EXPRESSION COMPILE.FILE.DEFINEQ 
                        COMPILE-FILE-SETF-SYMBOL-FUNCTION COMPILE.FILE.APPLY COMPILE.FILE.RESET)

      previous date: "29-Aug-86 17:04:12" {ERIS}<LISPCORE>LIBRARY>CMLCOMPILE.;62)


(* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT CMLCOMPILECOMS)

(RPAQQ CMLCOMPILECOMS 
       [(COMS (FUNCTIONS CL:COMPILE DISASSEMBLE)
              (FNS COMPILE-FILE INTERLISP-FORMAT-P INTERLISP-NLAMBDA-FUNCTION-P 
                   COMPILE-FILE-EXPRESSION COMPILE-FILE-WALK-FUNCTION ARGTYPE.STATE 
                   COMPILE.CHECK.ARGTYPE COMPILE.FILE.DEFINEQ COMPILE-FILE-SETF-SYMBOL-FUNCTION 
                   COMPILE-FILE-EX/IMPORT COMPILE.FILE.APPLY COMPILE.FILE.RESET COMPILE-IN-CORE)
              (VARS ARGTYPE.VARS)
              (PROP COMPILE-FILE-EXPRESSION DEFINEQ * SETF-SYMBOL-FUNCTION))
        [COMS (FNS NEWDEFC)
              (DECLARE: DONTEVAL@LOAD DOCOPY (P (MOVD (QUOTE NEWDEFC)
                                                      (QUOTE DEFC]
        (COMS (* ; "Optimizer definitions and environment hacking")
              (DEFINE-TYPES OPTIMIZERS)
              (FUNCTIONS COMPILER:OPTIMIZER-LIST)
              (FUNCTIONS DEFOPTIMIZER)
              (STRUCTURES COMPILER::ENV COMPILER:CONTEXT)
              (FNS COMPILER:COPY-ENV-WITH-FUNCTION COMPILER:COPY-ENV-WITH-VARIABLE 
                   COMPILER:ENV-BOUNDP COMPILER:ENV-FBOUNDP COMPILER:MAKE-EMPTY-ENV))
        (PROP COMPILE-FILE-EXPRESSION PRETTYCOMPRINT)
        (PROP FILETYPE CMLCOMPILE)
        (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
               (ADDVARS (NLAMA)
                      (NLAML)
                      (LAMA COMPILER:MAKE-EMPTY-ENV COMPILER:ENV-FBOUNDP COMPILER:ENV-BOUNDP 
                            COMPILER:COPY-ENV-WITH-VARIABLE COMPILER:COPY-ENV-WITH-FUNCTION 
                            COMPILE-FILE])
(DEFUN CL:COMPILE (NAME &OPTIONAL LAMBDA-EXPR) (LET ((NEW-NAME (OR NAME (QUOTE \CLCOMPILETEMP))))
                                                    (COMPILE-IN-CORE NEW-NAME (OR LAMBDA-EXPR
                                                                                  (GETD NAME)))
                                                    (AND LAMBDA-EXPR NAME (/PUTPROP NAME (QUOTE
                                                                                          EXPR)
                                                                                 LAMBDA-EXPR))
                                                    (OR NAME (GETD NEW-NAME))))

(DEFUN DISASSEMBLE (NAME-OR-COMPILED-FUNCTION &KEY LEVEL-P (RADIX 8)
                          (OUTPUT *STANDARD-OUTPUT*)
                          FIRST-BYTE MARKED-PC) (PRINTCODE
                                                 (if (CCODEP NAME-OR-COMPILED-FUNCTION)
                                                     then NAME-OR-COMPILED-FUNCTION
                                                   else (CL:COMPILE NIL (if (SYMBOLP 
                                                                            NAME-OR-COMPILED-FUNCTION
                                                                                   )
                                                                            then (SYMBOL-FUNCTION
                                                                                  
                                                                            NAME-OR-COMPILED-FUNCTION
                                                                                  )
                                                                          else 
                                                                            NAME-OR-COMPILED-FUNCTION
                                                                            )))
                                                 LEVEL-P RADIX OUTPUT FIRST-BYTE MARKED-PC))

(DEFINEQ

(COMPILE-FILE
  (CL:LAMBDA (FILENAME &KEY LAP REDEFINE OUTPUT-FILE (SAVE-EXPRS T)
                    (COMPILER-OUTPUT T)
                    (PROCESS-ENTIRE-FILE NIL PEFP))          (* bvm: " 8-Sep-86 16:57")
         (LET (COMPILE.FILE.AFTER VALUE COMPILE.FILE.VALUE)
              (DECLARE (SPECIAL COMPILE.FILE.AFTER COMPILE.FILE.VALUE))
              [RESETLST (RESETSAVE NIL (LIST (QUOTE RESETUNDO))
                               (RESETUNDO))
                     (RESETSAVE NLAML NLAML)
                     (RESETSAVE NLAMA NLAMA)
                     (RESETSAVE LAMS LAMS)
                     (RESETSAVE LAMA LAMA)
                     (RESETSAVE DFNFLG NIL)
                     (RESETSAVE COUTFILE COMPILER-OUTPUT)
                     (RESETSAVE STRF REDEFINE)
                     (RESETSAVE SVFLG (AND SAVE-EXPRS (QUOTE DEFER)))
                     (RESETSAVE LAPFLG LAP)
                     (LET ((*PACKAGE* *INTERLISP-PACKAGE*)
                           (*READ-BASE* 10)
                           (LOCALVARS SYSLOCALVARS)
                           (SPECVARS T)
                           STREAM LSTFIL ROOTNAME INTERLISP-FORMAT ENV FORM)
                          (DECLARE (SPECIAL *PACKAGE* *READ-BASE* LOCALVARS SPECVARS LSTFIL))
                          [RESETSAVE NIL (LIST (FUNCTION CLOSEF?)
                                               (SETQ STREAM (OPENSTREAM FILENAME (QUOTE INPUT]
                          (MULTIPLE-VALUE-SETQ (ENV FORM)
                                 (\PARSE-FILE-HEADER STREAM (QUOTE RETURN)
                                        T))
                          (SETQ INTERLISP-FORMAT (AND ENV (NEQ ENV *COMMON-LISP-READ-ENVIRONMENT*)))
                          (if (NOT PEFP)
                              then (SETQ PROCESS-ENTIRE-FILE INTERLISP-FORMAT))
                          (if LAP
                              then (SETQ LSTFIL COUTFILE))
                          (SETQ FILENAME (FULLNAME STREAM))
                          (RESETSAVE NIL (LIST (FUNCTION COMPILE.FILE.RESET)
                                               [SETQ OUTPUT-FILE (OPENSTREAM
                                                                  (OR OUTPUT-FILE (
                                                                                  PACKFILENAME.STRING
                                                                                   (QUOTE VERSION)
                                                                                   NIL
                                                                                   (QUOTE EXTENSION)
                                                                                   COMPILE.EXT
                                                                                   (QUOTE BODY)
                                                                                   FILENAME))
                                                                  (QUOTE OUTPUT)
                                                                  (QUOTE NEW)
                                                                  (QUOTE ((TYPE BINARY]
                                               STREAM
                                               (ROOTFILENAME FILENAME)))
                          (if OUTPUT-FILE
                              then (RESETSAVE LCFIL OUTPUT-FILE)
                                   (PRINT-COMPILE-HEADER (LIST STREAM)
                                          "COMPILE-FILEd" ENV))
                          (WITH-READER-ENVIRONMENT
                           ENV
                           (if NIL
                               then (PRINT (QUOTE (IN-PACKAGE "USER"))
                                           OUTPUT-FILE FILERDTBL) 
                                                             (* 
                                           "Force the output file to read in the appropriate package")
                                    (SETQ *PACKAGE* (FIND-PACKAGE "USER")))
                           (PROG (DEFERRED.EXPRESSIONS)
                                 (DECLARE (SPECIAL DEFERRED.EXPRESSIONS))
                             LP  (COMPILE-FILE-EXPRESSION FORM OUTPUT-FILE NIL PROCESS-ENTIRE-FILE)
                                 (SKIPSEPRS STREAM)
                                 (if (EOFP STREAM)
                                     then (AND PROCESS-ENTIRE-FILE (for EXP in (REVERSE 
                                                                                 DEFERRED.EXPRESSIONS
                                                                                      )
                                                                      do (APPLY* (CAR EXP)
                                                                                (CDR EXP)
                                                                                OUTPUT-FILE)))
                                          (CLOSEF STREAM)
                                          (RETURN))
                                 [SETQ FORM (LET ((EXPRESSION (READ STREAM)))
                                                 (if INTERLISP-FORMAT
                                                     then EXPRESSION
                                                   else (CMLTRANSLATE EXPRESSION]
                                 (GO LP)))
                          (PRINT NIL OUTPUT-FILE)
                          (SETQ COMPILE.FILE.VALUE (CLOSEF OUTPUT-FILE]
                                                             (* "Do these after UNDONLSETQ entered")
              (MAPC (REVERSE COMPILE.FILE.AFTER)
                    (FUNCTION EVAL))
              COMPILE.FILE.VALUE)))

(INTERLISP-FORMAT-P
  [LAMBDA (STREAM)                                           (* bvm: " 3-Aug-86 14:01")
    (SELCHARQ (PEEKCCODE STREAM)
         (; NIL)
         ((↑F "(") 
              T)
         NIL])

(INTERLISP-NLAMBDA-FUNCTION-P
  [LAMBDA (X)                                                (* lmm " 7-May-86 20:12")
    (AND (LITATOM X)
         (FMEMB (ARGTYPE X)
                (QUOTE (1 3)))
         (NOT (SPECIAL-FORM-P X])

(COMPILE-FILE-EXPRESSION
  [LAMBDA (FORM COMPILED.FILE COMPILE.TIME.TOO DEFER)
    (DECLARE (SPECIAL COMPILED.FILE))                        (* bvm: " 8-Sep-86 16:42")
    (AND (LISTP FORM)
         (SELECTQ (CAR FORM)
             (DECLARE: (PROG ((COMPILE.SPECIFIED NIL)
                              (LOAD.SPECIFIED T)
                              (EVAL.SPECIFIED T)
                              (FORM (CDR FORM)))
                         LP  (if (NLISTP FORM)
                                 then (RETURN)
                               elseif (NLISTP (CAR FORM))
                                 then (SELECTQ (CAR FORM)
                                          (DONTCOPY (SETQ LOAD.SPECIFIED NIL))
                                          ((DOCOPY COPY) 
                                               (SETQ LOAD.SPECIFIED T))
                                          (COPYWHEN [SETQ LOAD.SPECIFIED (EVAL (CAR (SETQ FORM
                                                                                     (CDR FORM])
                                          (FIRST (PRINTOUT COUTFILE 
                               "Warning: (DECLARE: -- FIRST -- --) not implemented in COMPILE-FILE: "
                                                        (CADR FORM)
                                                        T))
                                          ((NOTFIRST COMPILERVARS))
                                          (DONTEVAL@COMPILE 
                                               (SETQ COMPILE.SPECIFIED NIL))
                                          ((DOEVAL@COMPILE EVAL@COMPILE) 
                                               (SETQ COMPILE.SPECIFIED T))
                                          (EVAL@COMPILEWHEN 
                                               [SETQ COMPILE.SPECIFIED (EVAL (CAR (SETQ FORM
                                                                                   (CDR FORM])
                                          ((DOEVAL@LOAD EVAL@LOAD) 
                                               (SETQ EVAL.SPECIFIED T))
                                          (DONTEVAL@LOAD (SETQ EVAL.SPECIFIED NIL))
                                          (EVAL@LOADWHEN [SETQ EVAL.SPECIFIED
                                                          (EVAL (CAR (SETQ FORM (CDR FORM])
                                          (PRINT (CONS (CAR FORM)
                                                       (QUOTE (UNRECOGNIZED DECLARE TAG)))
                                                 COUTFILE))
                               else (if (NOT LOAD.SPECIFIED)
                                        then (if (OR COMPILE.SPECIFIED (AND COMPILE.TIME.TOO 
                                                                            EVAL.SPECIFIED))
                                                 then (EVAL (CAR FORM)))
                                      else (COMPILE-FILE-EXPRESSION (CAR FORM)
                                                  COMPILED.FILE
                                                  (OR COMPILE.SPECIFIED (AND COMPILE.TIME.TOO 
                                                                             EVAL.SPECIFIED))
                                                  DEFER)))
                             (SETQ FORM (CDR FORM))
                             (GO LP)))
             (PROGN (for X in (CDR FORM) do (COMPILE-FILE-EXPRESSION X COMPILED.FILE COMPILE.TIME.TOO 
                                                   DEFER)))
             ((QUOTE)                                 (* ; " ignore top level quoted expression -i")
                  NIL)
             (COMPILER-LET                        (* ; " top level compiler-let. bind variables and recursively compile sub-expressions. This is here mainly  for b PCL has top level compiler-lets")
                           [LET [(VARS (CL:MAPCAR (CL:FUNCTION (CL:LAMBDA (X)
                                                                      (if (CONSP X)
                                                                          then (CAR X)
                                                                        else X)))
                                              (CADR FORM)))
                                 (VALS (CL:MAPCAR [CL:FUNCTION
                                                   (CL:LAMBDA (X)
                                                          (if (CONSP X)
                                                              then (CL:EVAL (CADR X]
                                              (CADR FORM]
                                (PROGV VARS VALS (CL:MAPC (CL:FUNCTION (CL:LAMBDA (X)
                                                                              (
                                                                              COMPILE-FILE-EXPRESSION
                                                                               X COMPILED.FILE 
                                                                               COMPILE.TIME.TOO DEFER
                                                                               )))
                                                        (CDDR FORM])
             (EVAL-WHEN [LET [[EVAL.SPECIFIED (OR (FMEMB (QUOTE EVAL)
                                                         (CADR FORM))
                                                  (FMEMB (QUOTE CL:EVAL)
                                                         (CADR FORM]
                              [LOAD.SPECIFIED (OR (FMEMB (QUOTE LOAD)
                                                         (CADR FORM))
                                                  (FMEMB (QUOTE CL:LOAD)
                                                         (CADR FORM]
                              (COMPILE.SPECIFIED (OR (FMEMB (QUOTE COMPILE)
                                                            (CADR FORM))
                                                     (FMEMB (QUOTE CL:COMPILE)
                                                            (CADR FORM]
                             (COND
                                [(NOT LOAD.SPECIFIED)
                                 (COND
                                    ((OR COMPILE.SPECIFIED (AND COMPILE.TIME.TOO EVAL.SPECIFIED))
                                     (for INNER-FORM in (CDDR FORM) do (EVAL INNER-FORM]
                                (T (for INNER-FORM in (CDDR FORM)
                                      do (COMPILE-FILE-EXPRESSION INNER-FORM COMPILED.FILE
                                                (OR COMPILE.SPECIFIED (AND COMPILE.TIME.TOO 
                                                                           EVAL.SPECIFIED))
                                                DEFER])
             (IN-PACKAGE                                     (* 
               "This is special because it has to be dumped to the output BEFORE the package changes")
                         (PRINT FORM COMPILED.FILE FILERDTBL)
                         (EVAL FORM))
             (LET [(PROP (OR (GETPROP (CAR FORM)
                                    (QUOTE COMPILE-FILE-EXPRESSION))
                             (GETPROP (CAR FORM)
                                    (QUOTE COMPILE.FILE.EXPRESSION]
                  (if [AND (NOT PROP)
                           (NOT (SPECIAL-FORM-P (CAR FORM)))
                           (NOT (INTERLISP-NLAMBDA-FUNCTION-P (CAR FORM)))
                           (NEQ FORM (SETQ FORM (MACROEXPAND-1 FORM]
                      then (COMPILE-FILE-EXPRESSION FORM COMPILED.FILE COMPILE.TIME.TOO DEFER)
                    else (if COMPILE.TIME.TOO
                             then (EVAL FORM))
                         (if PROP
                             then (COMPILE.FILE.APPLY PROP FORM DEFER)
                           elseif [NOT (EQUAL FORM (SETQ FORM (WALK-FORM FORM :WALK-FUNCTION
                                                                     (FUNCTION 
                                                                      COMPILE-FILE-WALK-FUNCTION]
                             then (COMPILE-FILE-EXPRESSION FORM COMPILED.FILE COMPILE.TIME.TOO DEFER)
                           else (COMPILE.FILE.APPLY (FUNCTION PRINT)
                                       FORM DEFER])

(COMPILE-FILE-WALK-FUNCTION
  [LAMBDA (FORM)                                             (* lmm "26-Jun-86 17:25")
    (if (NLISTP FORM)
        then FORM
      else (VALUES FORM (INTERLISP-NLAMBDA-FUNCTION-P (CAR FORM])

(ARGTYPE.STATE
  [LAMBDA NIL
    (for X in ARGTYPE.VARS do (PRINTOUT T X , (EVAL (CADR X))
                                     T])

(COMPILE.CHECK.ARGTYPE
  [LAMBDA (X AT)                                             (* lmm "15-Jun-85 16:58")
    (if (NEQ AT (LET (BLKFLG)
                     (COMP.ARGTYPE X)))
        then                                                 (* 
                                                           "Incorrectly on one of the defining lists")
             (for ATYPEPAIR in ARGTYPE.VARS
                do (LET [(VAL (FMEMB X (EVALV (CADR ATYPEPAIR]
                        (if (EQ AT (CAR ATYPEPAIR))
                            then (if VAL
                                     then (PRINTOUT COUTFILE "Compiler confused: " X " on "
                                                 (CADR ATYPEPAIR)
                                                 " but compiler doesn't think its a "
                                                 (CADDR ATYPEPAIR)))
                                 [/SETTOPVAL (CADR ATYPEPAIR)
                                        (CONS X (PROGN (GETTOPVAL (CADR ATYPEPAIR]
                          else (if VAL
                                   then (PRINTOUT COUTFILE "Warning: compiler thought " X " "
                                               (LIST (QUOTE a)
                                                     (OR (CADDR (ASSOC AT ARGTYPE.VARS))
                                                         "LAMBDA spread")
                                                     (QUOTE function))
                                               " was a "
                                               (CADDR ATYPEPAIR)
                                               " because it was incorrectly on "
                                               (CADR ATYPEPAIR)
                                               T)
                                        (/SETTOPVAL (CADR ATYPEPAIR)
                                               (REMOVE X (PROGN (GETTOPVAL (CADR ATYPEPAIR])

(COMPILE.FILE.DEFINEQ
  [LAMBDA (FORM LCFIL)                                       (* bvm: " 8-Sep-86 16:55")
    (for DEF in (CDR FORM) do (COMPILE.CHECK.ARGTYPE (CAR DEF)
                                     (ARGTYPE (CADR DEF)))
                              (BYTECOMPILE2 (CAR DEF)
                                     (COMPILE1A (CAR DEF)
                                            (CADR DEF)
                                            NIL])

(COMPILE-FILE-SETF-SYMBOL-FUNCTION
  [LAMBDA (FORM LCFIL)                                       (* bvm: " 8-Sep-86 16:55")
    (if [AND (FMEMB (CAR (LISTP (THIRD FORM)))
                    (QUOTE (FUNCTION CL:FUNCTION)))
             (EQ (CAR (LISTP (SECOND FORM)))
                 (QUOTE QUOTE))
             (CONSP (SECOND (THIRD FORM]
        then (BYTECOMPILE2 (CADR (SECOND FORM))
                    (CADR (THIRD FORM)))
      else (PRINT (WALK-FORM FORM :WALK-FUNCTION (FUNCTION COMPILE-FILE-WALK-FUNCTION))
                  LCFIL])

(COMPILE-FILE-EX/IMPORT
  [LAMBDA (FORM LCFIL RDTBL)                                 (* bvm: " 3-Aug-86 15:05")
          
          (* * "EXPORT, IMPORT, SHADOW, USE-PACKAGE are all implicitly EVAL@COMPILE, since they have to affect the package being used to read what follows")

    (PRINT FORM LCFIL RDTBL)
    (EVAL FORM])

(COMPILE.FILE.APPLY
  [LAMBDA (PROP FORM DEFER)                                  (* bvm: " 8-Sep-86 16:55")
    (if DEFER
        then (push DEFERRED.EXPRESSIONS (CONS PROP FORM))
      else (APPLY* PROP FORM COMPILED.FILE])

(COMPILE.FILE.RESET
  [LAMBDA (COMPILED.FILE SOURCEFILE ROOTNAME)                (* bvm: " 9-Sep-86 15:16")
                                                             (* Cleans up after brecompile and 
                                                             bcompl have finished operating,)
    (if (AND COMPILED.FILE (OPENP COMPILED.FILE))
        then (CLOSE-AND-MAYBE-DELETE COMPILED.FILE))
    (if SOURCEFILE
        then (CLOSEF? SOURCEFILE))
    (if (NULL RESETSTATE)
        then                                                 (* Finished successfully.)
             (/SETATOMVAL (QUOTE NOTCOMPILEDFILES)
                    (REMOVE ROOTNAME NOTCOMPILEDFILES))      (* Removes FILES from 
                                                             NOTCOMPILEDFILES.)])

(COMPILE-IN-CORE
  [LAMBDA (fn-name fn-expr fn-type NOSAVE)
    (DECLARE (SPECVARS LCFIL LAPFLG STRF SVFLG LSTFIL SPECVARS LOCALVARS DONT-TRANSFER-PUTD))
                                                             (* lmm " 2-Jun-86 22:04")
          
          (* in-core compiling for functions and forms, without the interview.
          if X is a list, we assume that we are being called merely to display the lap 
          and machine code. the form is compiled as the definition of FOO but the 
          compiled :CODE is thrown away. -
          if X is a litatom, then saving, redefining, and printing is controlled by the 
          flags.)

    (LET ((NOREDEFINE NIL)
          (PRINTLAP NIL)
          (DONT-TRANSFER-PUTD T))
         (RESETVARS [(NLAMA NLAMA)
                     (NLAML NLAML)
                     (LAMS LAMS)
                     (LAMA LAMA)
                     (NOFIXFNSLST NOFIXFNSLST)
                     (NOFIXVARSLST NOFIXVARSLST)
                     (COUTFILE (COND
                                  ((AND (BOUNDP (QUOTE NULLFILE))
                                        (STREAMP NULLFILE)
                                        (OPENP NULLFILE))
                                   NULLFILE)
                                  (T (SETQ NULLFILE (OPENFILE (QUOTE {NULL})
                                                           (QUOTE OUTPUT]
                    (RETURN (RESETLST                        (* RESETLST to provide reset context 
                                                             for macros under COMPILE1 as generated 
                                                             e.g. by DECL.)
                                   (PROG ((LCFIL)
                                          [LAPFLG (AND PRINTLAP (COND
                                                                   (BYTECOMPFLG T)
                                                                   (T 2]
                                          (STRF (NOT NOREDEFINE))
                                          (SVFLG (if (EQ fn-type (QUOTE SELECTOR))
                                                     then (QUOTE SELECTOR)
                                                   else (NOT NOSAVE)))
                                          (LSTFIL T)
                                          (SPECVARS SYSSPECVARS)
                                          (LOCALVARS T))
                                         (RETURN (PROGN (SETQ fn-expr (COMPILE1A fn-name fn-expr T))
                                                        (PROG ((FREEVARS FREEVARS))
                                                              (RETURN (BYTECOMPILE2 fn-name fn-expr])
)

(RPAQQ ARGTYPE.VARS ((1 NLAML "NLAMBDA spread")
                     (2 LAMA "LAMBDA nospread")
                     (0 LAMS "LAMBDA spread")
                     (3 NLAMA "NLAMBDA no-spread")))

(PUTPROPS DEFINEQ COMPILE-FILE-EXPRESSION COMPILE.FILE.DEFINEQ)

(PUTPROPS * COMPILE-FILE-EXPRESSION NILL)

(PUTPROPS SETF-SYMBOL-FUNCTION COMPILE-FILE-EXPRESSION COMPILE-FILE-SETF-SYMBOL-FUNCTION)
(DEFINEQ

(NEWDEFC
  [LAMBDA (NM DF)                                            (* gbn " 7-Aug-86 18:54")
    (COND
       ((EQ SVFLG (QUOTE DEFER))
        (push COMPILE.FILE.AFTER (LIST (FUNCTION NEWDEFC)
                                       (KWOTE NM)
                                       (KWOTE DF)
                                       T)))
       ((OR (NULL DFNFLG)
            (EQ DFNFLG T))
        [COND
           ((GETD NM)
            (VIRGINFN NM T)
            (COND
               ((NULL DFNFLG)
                (FORMAT *ERROR-OUTPUT* "~&~A redefined ~&" NM)
                (SAVEDEF NM]
        (/PUTD NM DF T))
       (T (/PUTPROP NM (QUOTE CODE)
                 DF)))
    DF])
)
(DECLARE: DONTEVAL@LOAD DOCOPY 
(MOVD (QUOTE NEWDEFC)
      (QUOTE DEFC))
)



(* ; "Optimizer definitions and environment hacking")

(DEF-DEFINE-TYPE OPTIMIZERS "COMPILER OPTIMIZERS" )

(DEFMACRO COMPILER:OPTIMIZER-LIST (FN) (BQUOTE (GET (\, FN)
                                                    (QUOTE COMPILER:OPTIMIZER-LIST))))

(DEFDEFINER DEFOPTIMIZER OPTIMIZERS
                         (NAME OPT-NAME &REST ARGLIST-BODY &ENVIRONMENT ENV)
                         "define an optimizer for NAME"
                         (COND
                            ((NOT ARGLIST-BODY)              (* ; "(defoptimizer name optfn)")
                             (PROG1 (BQUOTE (CL:PUSHNEW (QUOTE (\, OPT-NAME))
                                                   (COMPILER:OPTIMIZER-LIST (QUOTE (\, NAME)))))
                                    (SETQ NAME (INTERN (STRING-APPEND NAME "-OPTIMIZED-BY-" OPT-NAME)
                                                      (SYMBOL-PACKAGE OPT-NAME)))
                                                             (* ; " optimizer name is generated")
                                    ))
                            (T (LET* ((FORM-NAME NAME)
                                      (ARG-LIST OPT-NAME)
                                      (OPT-FN-NAME (if (AND OPT-NAME (SYMBOLP OPT-NAME)
                                                            (CDR ARGLIST-BODY))
                                                       then 
                                                  (* ; 
                                                  "(defoptimizer form-name opt-name arglist . body)")
                                                            (SETQ NAME OPT-NAME) 
                                                             (* ; "optimizer name is opt-name")
                                                            (PROG1 OPT-NAME (SETQ ARG-LIST
                                                                             (POP ARGLIST-BODY)))
                                                     else 
                                                  (* ; 
                                "(defoptimizer form-name arglist . body) optimizer name is form name")
                                                          (PACK* "optimize-" FORM-NAME))))
                                     (MULTIPLE-VALUE-BIND
                                      (BODY DECLS DOC)
                                      (PARSE-DEFMACRO ARG-LIST (QUOTE $$WHOLE)
                                             ARGLIST-BODY NAME ENV :ENVIRONMENT (QUOTE $$ENV)
                                             :CONTEXT
                                             (QUOTE $$CTX))
                                      (BQUOTE (PROGN (DEFUN (\, OPT-FN-NAME) ($$WHOLE $$ENV $$CTX)
                                                        (\,@ DECLS)
                                                        (\, BODY))

                                                     (CL:PUSHNEW (QUOTE (\, OPT-FN-NAME))
                                                            (COMPILER:OPTIMIZER-LIST
                                                             (QUOTE (\, FORM-NAME)))))))))))

(DEFSTRUCT (COMPILER::ENV (:CONSTRUCTOR COMPILER::MAKE-ENV)
                          (:COPIER COMPILER::COPY-ENV)
                          (:PREDICATE COMPILER::ENV-P)) (VENV NIL) (FENV NIL))

(DEFSTRUCT (COMPILER:CONTEXT (:CONSTRUCTOR COMPILER:MAKE-CONTEXT)
                             (:COPIER COMPILER::COPY-CONTEXT)
                             (:PREDICATE COMPILER::CONTEXT-P)) (TOP-LEVEL-P NIL) (VALUES-USED 
                                                                                        :UNKNOWN)
                                                                                 (PREDICATE-P NIL))

(DEFINEQ

(COMPILER:COPY-ENV-WITH-FUNCTION
  (CL:LAMBDA (ENV FN &OPTIONAL (KIND :FUNCTION)
                  EXP-FN)                                    (* "Pavel" "26-Apr-86 15:13")
                                                             (* "Pavel" "25-Apr-86 18:53")
         (LET [(NEW-ENV (CL:IF ENV (COMPILER::COPY-ENV ENV)
                               (COMPILER:MAKE-EMPTY-ENV]
              (CL:PUSH (LIST FN KIND EXP-FN)
                     (COMPILER::ENV-FENV NEW-ENV))
              NEW-ENV)))

(COMPILER:COPY-ENV-WITH-VARIABLE
  (CL:LAMBDA (ENV VAR &OPTIONAL (KIND :LEXICAL))             (* "Pavel" "26-Apr-86 15:12")
                                                             (* "Pavel" "25-Apr-86 18:54")
         (LET [(NEW-ENV (CL:IF ENV (COMPILER::COPY-ENV ENV)
                               (COMPILER:MAKE-EMPTY-ENV]
              (CL:PUSH (CONS VAR KIND)
                     (COMPILER::ENV-VENV NEW-ENV))
              NEW-ENV)))

(COMPILER:ENV-BOUNDP
  [CL:LAMBDA (ENV VAR)                                       (* "Pavel" "25-Apr-86 18:41")
         (LET [(BINDING (CL:ASSOC VAR (COMPILER::ENV-VENV ENV]
              (AND BINDING (CDR BINDING])

(COMPILER:ENV-FBOUNDP
  [CL:LAMBDA (ENV FN)                                        (* "Pavel" "25-Apr-86 18:42")
         (LET [(BINDING (CL:ASSOC FN (COMPILER::ENV-FENV ENV]
              (AND BINDING (LET ((KIND (SECOND BINDING)))
                                (CL:IF (EQ KIND :MACRO)
                                       (VALUES :MACRO (THIRD BINDING))
                                       KIND])

(COMPILER:MAKE-EMPTY-ENV
  (CL:LAMBDA NIL (COMPILER::MAKE-ENV)))
)

(PUTPROPS PRETTYCOMPRINT COMPILE-FILE-EXPRESSION NILL)

(PUTPROPS CMLCOMPILE FILETYPE COMPILE-FILE)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA COMPILER:MAKE-EMPTY-ENV COMPILER:ENV-FBOUNDP COMPILER:ENV-BOUNDP 
                     COMPILER:COPY-ENV-WITH-VARIABLE COMPILER:COPY-ENV-WITH-FUNCTION COMPILE-FILE)
)
(PUTPROPS CMLCOMPILE COPYRIGHT ("Xerox Corporation" 1985 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (4078 26483 (COMPILE-FILE 4088 . 9871) (INTERLISP-FORMAT-P 9873 . 10094) (
INTERLISP-NLAMBDA-FUNCTION-P 10096 . 10338) (COMPILE-FILE-EXPRESSION 10340 . 18850) (
COMPILE-FILE-WALK-FUNCTION 18852 . 19100) (ARGTYPE.STATE 19102 . 19249) (COMPILE.CHECK.ARGTYPE 19251
 . 21233) (COMPILE.FILE.DEFINEQ 21235 . 21711) (COMPILE-FILE-SETF-SYMBOL-FUNCTION 21713 . 22279) (
COMPILE-FILE-EX/IMPORT 22281 . 22623) (COMPILE.FILE.APPLY 22625 . 22877) (COMPILE.FILE.RESET 22879 . 
23720) (COMPILE-IN-CORE 23722 . 26481)) (26895 27613 (NEWDEFC 26905 . 27611)) (31529 33256 (
COMPILER:COPY-ENV-WITH-FUNCTION 31539 . 32063) (COMPILER:COPY-ENV-WITH-VARIABLE 32065 . 32535) (
COMPILER:ENV-BOUNDP 32537 . 32765) (COMPILER:ENV-FBOUNDP 32767 . 33184) (COMPILER:MAKE-EMPTY-ENV 33186
 . 33254)))))
STOP