;;; -*- Mode:Lisp; Readtable:T; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 121.10
;;; Reason:
;;;  Make ALTERNATE-MACRO-DEFINITIONS of PROG and PROG*
;;;  conform to Common LISP.
;;; Written 22-Jan-87 18:01:20 by jrm (Joe Marshall) at site LMI Cambridge
;;; while running on Laurie Anderson from band 2
;;; with Experimental System 121.7, Experimental Lambda-Diag 15.0, Experimental ZMail 70.1, Experimental KERMIT 32.0, Experimental Unix-Interface 10.0, Experimental Local-File 72.0, Experimental FILE-Server 21.0, Experimental Tape 13.0, Experimental IMicro 19.0, microcode 1729, SDU Boot Tape 3.14, SDU ROM 102.



; From modified file DJ: L.SYS2; CLMAC.LISP#8 at 22-Jan-87 18:01:46
#8R SYSTEM-INTERNALS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; CLMAC  "

(defun make-prog-macroexpander (prog-type let-type)
  #'(lambda (prog-form macroenvironment)
      (when (not (>= (length prog-form) 2))
	(ferror nil "Too few arguments to ~S in ~S." prog-type prog-form))
      (let ((binding-list (second prog-form))
	    (body         (rest (rest prog-form))))
	;; Macroexpand body to get declarations.
	(let ((macroexpanded-body
		(mapcar #'(lambda (form) (macroexpand form macroenvironment)) body)))
	  ;; Scan out declarations.
	  (do ((forms macroexpanded-body (rest forms))
	       (decls '() (cons (first forms) decls)))
	      ((or (not (consp (first forms)))
		   (not (eq (car (first forms)) 'LISP::DECLARE)))
	       `(BLOCK NIL
		  (,let-type ,binding-list
		   ,@(reverse decls)
		   (TAGBODY ,@forms)))))))))

))

; From modified file DJ: L.SYS2; CLMAC.LISP#8 at 22-Jan-87 18:01:52
#8R SYSTEM-INTERNALS#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; CLMAC  "

(deff prog-macro-expander  (make-prog-macroexpander 'PROG  'LET))
(deff prog*-macro-expander (make-prog-macroexpander 'PROG* 'LET*))

(defprop prog  (macro . prog-macro-expander)  alternate-macro-definition)
(defprop prog* (macro . prog*-macro-expander) alternate-macro-definition)

))
