(FILECREATED "18-Sep-86 14:43:52" {ERIS}<LISPCORE>LIBRARY>CMLCOMPILE.;65 33835  

      changes to:  (FNS COMPILE.FILE.DEFINEQ)

      previous date: "15-Sep-86 18:08:10" {ERIS}<LISPCORE>LIBRARY>CMLCOMPILE.;64)


(* 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: "15-Sep-86 18:04")
         (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: "18-Sep-86 14:35")
    (for DEF in (CDR FORM) unless (FMEMB (CAR DEF)
                                         DONTCOMPILEFNS) 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 (3949 26572 (COMPILE-FILE 3959 . 9742) (INTERLISP-FORMAT-P 9744 . 9965) (
INTERLISP-NLAMBDA-FUNCTION-P 9967 . 10209) (COMPILE-FILE-EXPRESSION 10211 . 18716) (
COMPILE-FILE-WALK-FUNCTION 18718 . 18966) (ARGTYPE.STATE 18968 . 19115) (COMPILE.CHECK.ARGTYPE 19117
 . 21032) (COMPILE.FILE.DEFINEQ 21034 . 21800) (COMPILE-FILE-SETF-SYMBOL-FUNCTION 21802 . 22368) (
COMPILE-FILE-EX/IMPORT 22370 . 22712) (COMPILE.FILE.APPLY 22714 . 22966) (COMPILE.FILE.RESET 22968 . 
23809) (COMPILE-IN-CORE 23811 . 26570)) (26984 27702 (NEWDEFC 26994 . 27700)) (31618 33345 (
COMPILER:COPY-ENV-WITH-FUNCTION 31628 . 32152) (COMPILER:COPY-ENV-WITH-VARIABLE 32154 . 32624) (
COMPILER:ENV-BOUNDP 32626 . 32854) (COMPILER:ENV-FBOUNDP 32856 . 33273) (COMPILER:MAKE-EMPTY-ENV 33275
 . 33343)))))
STOP