[movitz-cvs] CVS movitz/losp/muerte

ffjeld ffjeld at common-lisp.net
Wed Mar 19 12:37:24 UTC 2008


Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv19458

Modified Files:
	eval.lisp 
Log Message:
Add macroexpand, macroexpand-1, and *macroexpand-hook*.


--- /project/movitz/cvsroot/movitz/losp/muerte/eval.lisp	2008/03/18 16:24:30	1.22
+++ /project/movitz/cvsroot/movitz/losp/muerte/eval.lisp	2008/03/19 12:37:22	1.23
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Fri Oct 19 21:15:12 2001
 ;;;;                
-;;;; $Id: eval.lisp,v 1.22 2008/03/18 16:24:30 ffjeld Exp $
+;;;; $Id: eval.lisp,v 1.23 2008/03/19 12:37:22 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -25,11 +25,15 @@
 (defun eval-form (form env)
   "3.1.2.1 Form Evaluation."
   (check-stack-limit)
-  (typecase form
-    (null nil)
-    (symbol (eval-symbol form env))
-    (cons (eval-cons form env))
-    (t form)))
+  (multiple-value-bind (macro-expansion expanded-p)
+      (macroexpand form env)
+    (if expanded-p
+	(eval-form macro-expansion env)
+	(typecase form
+	  (null nil)
+	  (symbol (eval-symbol form env))
+	  (cons (eval-cons form env))
+	  (t form)))))
 
 (defun env-binding (env var)
   ;; (warn "env: ~S in ~S" var env)
@@ -70,62 +74,58 @@
 
 (defun eval-cons (form env)
   "3.1.2.1.2 Conses as Forms"
-  (let ((macro-function (macro-function (car form))))
-    (if macro-function
-	(eval-form (funcall macro-function form nil)
-		   env)
-	(case (car form)
-	  (quote (cadr form))
-	  (function (eval-function (second form) env))
-	  (if (if (eval-form (second form) env)
-		  (eval-form (third form) env)
-		  (eval-form (fourth form) env)))
-	  (progn (eval-progn (cdr form) env))
-	  (prog1 (prog1 (eval-form (cadr form) env)
-		   (eval-progn (cddr form) env)))
-	  (tagbody (eval-tagbody form env))
-	  ((block)
-	   (catch form
-	     (eval-progn (cddr form)
-			 (cons (list* +eval-binding-type-block+
-				      (cadr form)
-				      form)
-			       env))))
-	  ((return-from)
-	   (let ((b (op-env-binding +eval-binding-type-block+ env  (cadr form))))
-	     (unless b (error "Block ~S is not visible." (cadr form)))
-	     (throw (cdr b)
-	       (eval-form (caddr form) env))))
-	  (go (eval-go form env))
-	  (setq (eval-setq form env))
-	  (setf (eval-setf form env))
-	  ((defvar) (eval-defvar form env))
-	  (let (eval-let (cadr form) (cddr form) env))
-	  ((defun) (eval-defun (cadr form) (caddr form) (cdddr form) env))
-	  ((lambda) (eval-function form env)) ; the lambda macro..
-	  ((multiple-value-bind)
-	   (eval-m-v-bind form env))
-	  ((multiple-value-prog1)
-	   (multiple-value-prog1 (eval-form (cadr form) env)
-	     (eval-progn (cddr form) env)))
-	  ((destructuring-bind)
-	   (eval-progn (cdddr form)
-		       (make-destructuring-env (cadr form)
-					       (eval-form (caddr form) env)
-					       env)))
-	  ((catch)
-	   (catch (eval-form (second form) env)
-	     (eval-progn (cddr form) env)))
-	  ((throw)
-	   (throw (eval-form (second form) env)
-	     (eval-form (third form) env)))
-	  ((unwind-protect)
-	   (unwind-protect
-		(eval-form (second form) env)
+  (case (car form)
+    (quote (cadr form))
+    (function (eval-function (second form) env))
+    (if (if (eval-form (second form) env)
+	    (eval-form (third form) env)
+	    (eval-form (fourth form) env)))
+    (progn (eval-progn (cdr form) env))
+    (prog1 (prog1 (eval-form (cadr form) env)
 	     (eval-progn (cddr form) env)))
-	  ((macrolet symbol-macrolet)
-	   (error "Special operator ~S not implemented in ~S." (car form) 'eval))
-	  (t (eval-funcall form env))))))
+    (tagbody (eval-tagbody form env))
+    ((block)
+     (catch form
+       (eval-progn (cddr form)
+		   (cons (list* +eval-binding-type-block+
+				(cadr form)
+				form)
+			 env))))
+    ((return-from)
+     (let ((b (op-env-binding +eval-binding-type-block+ env  (cadr form))))
+       (unless b (error "Block ~S is not visible." (cadr form)))
+       (throw (cdr b)
+	 (eval-form (caddr form) env))))
+    (go (eval-go form env))
+    (setq (eval-setq form env))
+    (setf (eval-setf form env))
+    ((defvar) (eval-defvar form env))
+    (let (eval-let (cadr form) (cddr form) env))
+    ((defun) (eval-defun (cadr form) (caddr form) (cdddr form) env))
+    ((lambda) (eval-function form env)) ; the lambda macro..
+    ((multiple-value-bind)
+     (eval-m-v-bind form env))
+    ((multiple-value-prog1)
+     (multiple-value-prog1 (eval-form (cadr form) env)
+       (eval-progn (cddr form) env)))
+    ((destructuring-bind)
+     (eval-progn (cdddr form)
+		 (make-destructuring-env (cadr form)
+					 (eval-form (caddr form) env)
+					 env)))
+    ((catch)
+     (catch (eval-form (second form) env)
+       (eval-progn (cddr form) env)))
+    ((throw)
+     (throw (eval-form (second form) env)
+       (eval-form (third form) env)))
+    ((unwind-protect)
+     (unwind-protect
+	  (eval-form (second form) env)
+       (eval-progn (cddr form) env)))
+    ((macrolet symbol-macrolet)
+     (error "Special operator ~S not implemented in ~S." (car form) 'eval))
+    (t (eval-funcall form env))))
 
 (defun eval-progn (forms env)
   (do ((p forms (cdr p)))
@@ -453,6 +453,24 @@
 	      (setf (symbol-function name) function))
 	    t nil)))
 
+(defun macroexpand-1 (form &optional env)
+  (if (atom form)
+      (values form nil)
+      (let ((macro-function (macro-function (car form))))
+	(if macro-function
+	    (values (funcall *macroexpand-hook* macro-function form env)
+		    t)
+	    (values form
+		    nil)))))
+
+(defun macroexpand (form &optional env)
+  (do ((expanded-at-all-p nil)) (nil)
+    (multiple-value-bind (expansion expanded-p)
+	(macroexpand-1 form env)
+      (when (not expanded-p)
+	(return (values expansion expanded-at-all-p)))
+      (setf form expansion
+	    expanded-at-all-p t))))
 
 (defun proclaim (declaration)
   ;; What do do?




More information about the Movitz-cvs mailing list