[movitz-cvs] CVS update: movitz/eval.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Mon Oct 11 13:46:58 UTC 2004


Update of /project/movitz/cvsroot/movitz
In directory common-lisp.net:/tmp/cvs-serv30338

Modified Files:
	eval.lisp 
Log Message:
Make movitz-constantp and movitz-eval understand compiler-macros.

Date: Mon Oct 11 15:46:57 2004
Author: ffjeld

Index: movitz/eval.lisp
diff -u movitz/eval.lisp:1.7 movitz/eval.lisp:1.8
--- movitz/eval.lisp:1.7	Wed Jul 21 16:14:29 2004
+++ movitz/eval.lisp	Mon Oct 11 15:46:56 2004
@@ -9,7 +9,7 @@
 ;;;; Created at:    Thu Nov  2 17:45:05 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: eval.lisp,v 1.7 2004/07/21 14:14:29 ffjeld Exp $
+;;;; $Id: eval.lisp,v 1.8 2004/10/11 13:46:56 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -56,29 +56,41 @@
 	   (eq 'muerte.cl::quote (first x)))
        t))
 
-(defun movitz-constantp (form &optional (environment nil))
-  (let ((form (translate-program form :cl :muerte.cl)))
-    (typecase form
-      (keyword t)
-      (symbol (or (movitz-env-get form 'constantp nil environment)
-		  (typep (movitz-binding form environment) 'constant-object-binding)))
-      (cons (case (car form)
-	      ((muerte.cl:quote) t)
-	      ((muerte.cl:not)
-	       (movitz-constantp (second form)))
-	      ((muerte.cl:+ muerte.cl:- muerte.cl:* muerte.cl:coerce)
-	       (every (lambda (sub-form)
-			(movitz-constantp sub-form environment))
-		      (cdr form)))))
-      (t t))))				; anything else is self-evaluating.
-
-
-(defun isconst (x)
-  (or (integerp x)
-      (stringp x)
-      (eq t x)
-      (eq nil x)
-      (quote-form-p x)))
+(defun movitz-constantp (form &optional (env nil))
+  (typecase form
+    (keyword t)
+    (symbol
+     (let ((form (translate-program form :cl :muerte.cl)))
+       (or (movitz-env-get form 'constantp nil env)
+	   (typep (movitz-binding form env) 'constant-object-binding))))
+    (cons
+     (let* ((compiler-macro-function (movitz-compiler-macro-function (car form) env))
+	    (compiler-macro-expansion (and compiler-macro-function
+					   (funcall *movitz-macroexpand-hook*
+						    compiler-macro-function
+						    form env))))
+       (or (let ((form (translate-program form :cl :muerte.cl)))
+	     (case (car form)
+	       ((muerte.cl:quote) t)
+	       ((muerte.cl:not)
+		(movitz-constantp (second form)))
+	       ((muerte.cl:+ muerte.cl:- muerte.cl:* muerte.cl:coerce)
+		(every (lambda (sub-form)
+			 (movitz-constantp sub-form env))
+		       (cdr form)))))
+	   (and compiler-macro-function
+		(not (movitz-env-get (car form) 'notinline nil env))
+		(not (eq form compiler-macro-expansion))
+		(movitz-constantp compiler-macro-expansion env)))))
+    (t t)))				; anything else is self-evaluating.
+
+
+;;;(defun isconst (x)
+;;;  (or (integerp x)
+;;;      (stringp x)
+;;;      (eq t x)
+;;;      (eq nil x)
+;;;      (quote-form-p x)))
 
 (defun eval-form (&rest args)
   (apply 'movitz-eval args))
@@ -115,11 +127,32 @@
 
 (defun eval-cons (form env top-level-p)
   "3.1.2.1.2 Conses as Forms"
-  (let ((operator (car form)))
-    (declare (ignore operator))
+  (let* ((operator (car form))
+	 (compiler-macro-function (movitz-compiler-macro-function operator env))
+	 (compiler-macro-expansion (and compiler-macro-function
+					(funcall *movitz-macroexpand-hook*
+						 compiler-macro-function
+						 form env))))
     (cond
-     ((movitz-constantp form env)
-      (eval-constant-compound form env top-level-p))
+;;;     ((movitz-constantp form env)
+;;;      (eval-constant-compound form env top-level-p))
+     ((member operator '(cl:quote muerte.cl::quote))
+      (eval-self-evaluating (second form) env top-level-p))
+     ((member operator '(muerte.cl::not))
+      (not (eval-form (second form) env nil)))
+     ((member operator '(muerte.cl:+ muerte.cl:- muerte.cl:*))
+      (apply (translate-program (car form) :muerte.cl :cl)
+	     (mapcar (lambda (sub-form)
+		       (movitz-eval sub-form env nil))
+		     (cdr form))))
+     ((member operator '(muerte.cl:coerce))
+      (apply #'coerce
+	     (mapcar (lambda (arg) (movitz-eval arg env nil))
+		     (cdr form))))
+     ((and compiler-macro-function
+	   (not (movitz-env-get (car form) 'notinline nil env))
+	   (not (eq form compiler-macro-expansion)))
+      (movitz-eval compiler-macro-expansion env top-level-p))
 ;;;     ((lambda-form-p form)
 ;;;      (eval-lambda-form form env top-level-p))
 ;;;     ((symbolp operator)





More information about the Movitz-cvs mailing list