;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 121.21
;;; Reason:
;;;  Hacked compiler to handle lexical closures created by the new evaluator.
;;; Written 2-Feb-87 10:36:33 by rauen at site LMI Cambridge
;;; while running on Poindexter from band 3
;;; with Experimental System 121.20, Experimental Lambda-Diag 15.0, Experimental ZMail 70.2, Experimental KERMIT 32.0, Experimental Unix-Interface 10.0, Experimental Local-File 72.0, Experimental FILE-Server 21.0, Experimental Tape 13.0, microcode 1730, SDU Boot Tape 3.14, SDU ROM 103.



; From modified file DJ: L.SYS; QCP1.LISP#677 at 2-Feb-87 10:36:47
#8R COMPILER#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "COMPILER")))
  (PATCH-SOURCE-FILE "SYS: SYS; QCP1  "

(DEFUN COMPILE (NAME &OPTIONAL LAMBDA-EXP (PROCESSING-MODE 'MACRO-COMPILE))
  "Compile the definition of NAME,
or its previous interpreted definition if it is already compiled.
If LAMBDA-EXP is supplied, it is compiled and made the definition of NAME.
If NAME is NIL, LAMBDA-EXP is compiled and the result is just returned."
; Temporary areas are no more.
; (AND QC-FILE-IN-PROGRESS	;Check for condition likely to cause temporary area lossage
;      (FORMAT *ERROR-OUTPUT* "~&COMPILE: Compiler entered recursively; you may lose.~%"))
  (IF (NULL NAME)
      (COMPILE-LAMBDA LAMBDA-EXP (GENSYM))
    (LOCKING-RESOURCES-NO-QFASL
      (FILE-OPERATION-WITH-WARNINGS (T ':COMPILE)
	(COMPILER-WARNINGS-CONTEXT-BIND
	  (LET (TEM FILE-SPECIAL-LIST FILE-UNSPECIAL-LIST FILE-LOCAL-DECLARATIONS)
	    (QC-PROCESS-INITIALIZE)
	    (OR LAMBDA-EXP
		(AND (FDEFINEDP NAME)
		     (SETQ TEM (FDEFINITION (SI:UNENCAPSULATE-FUNCTION-SPEC NAME)))
		     (TYPECASE TEM
		       (CONS (SETQ LAMBDA-EXP TEM))
		       (CLOSURE 
			(IF (AND (FIND-PACKAGE "INTERPRETER")
				 (BOUNDP-IN-CLOSURE TEM
				   (INTERN "INTERPRETER-CLOSURE" "INTERPRETER"))
				 (SYMEVAL-IN-CLOSURE TEM
				   (INTERN "INTERPRETER-CLOSURE" "INTERPRETER")))
			    (SETQ LAMBDA-EXP 
				  (SYMEVAL-IN-CLOSURE TEM 
				    (INTERN "ORIGINAL-DEFINITION" "INTERPRETER")))
			  (FERROR "Compilation of closures not yet hacked.")))
		       (COMPILED-FUNCTION
			(SETQ TEM (ASSQ 'INTERPRETED-DEFINITION
					(DEBUGGING-INFO TEM)))
			(SETQ LAMBDA-EXP (CADR TEM)))
		       (T
			NIL)))
		(FERROR "Can't find LAMBDA expression for ~S" NAME))
	    (LET ((INHIBIT-FDEFINE-WARNINGS T))
	      (COMPILE-1 NAME LAMBDA-EXP PROCESSING-MODE))
	    NAME))))))
))
