[movitz-cvs] CVS update: movitz/losp/muerte/arithmetic-macros.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Sat Aug 20 20:23:35 UTC 2005


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

Modified Files:
	arithmetic-macros.lisp 
Log Message:
Minor tweaks to macro expanders.

Date: Sat Aug 20 22:23:35 2005
Author: ffjeld

Index: movitz/losp/muerte/arithmetic-macros.lisp
diff -u movitz/losp/muerte/arithmetic-macros.lisp:1.9 movitz/losp/muerte/arithmetic-macros.lisp:1.10
--- movitz/losp/muerte/arithmetic-macros.lisp:1.9	Tue Nov 23 17:00:20 2004
+++ movitz/losp/muerte/arithmetic-macros.lisp	Sat Aug 20 22:23:34 2005
@@ -1,6 +1,6 @@
 ;;;;------------------------------------------------------------------
 ;;;; 
-;;;;    Copyright (C) 2003-2004, 
+;;;;    Copyright (C) 2003-2005, 
 ;;;;    Department of Computer Science, University of Tromso, Norway.
 ;;;; 
 ;;;;    For distribution policy, see the accompanying file COPYING.
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Sat Jul 17 13:42:46 2004
 ;;;;                
-;;;; $Id: arithmetic-macros.lisp,v 1.9 2004/11/23 16:00:20 ffjeld Exp $
+;;;; $Id: arithmetic-macros.lisp,v 1.10 2005/08/20 20:23:34 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -41,27 +41,32 @@
      (:testb 1 :cl)))
 
 (define-compiler-macro + (&whole form &rest operands &environment env)
-  (case (length operands)
-    (0 0)
-    (1 (first operands))
-    (2 `(let ((x ,(first operands))
-	      (y ,(second operands)))
-	  (++%2op x y)))
-    (t (multiple-value-bind (constant-term non-constants)
-	   (loop for operand in operands
-	       if (movitz:movitz-constantp operand env)
-	       sum (movitz:movitz-eval operand env) into constant-term
-	       else collect operand into non-constant-operands
-	       finally (return (values constant-term non-constant-operands)))
-	 (cond
-	  ((null non-constants)
-	   constant-term)
-	  ((and (= 0 constant-term)
-		(not (cdr non-constants)))
-	   (car non-constants))
-	  ((= 0 constant-term)
-	   `(+ (+ ,(first non-constants) ,(second non-constants)) ,@(cddr non-constants)))
-	  (t `(+ (+ ,constant-term ,(first non-constants)) ,@(cdr non-constants))))))))
+  (flet ((term (x) (if (and nil (symbolp x))
+		       (gensym (format nil "term-~A-" x))
+		     (gensym "term-"))))
+    (case (length operands)
+      (0 0)
+      (1 (first operands))
+      (2 (let ((term1 (term (first operands)))
+	       (term2 (term (second operands))))
+	   `(let ((,term1 ,(first operands))
+		  (,term2 ,(second operands)))
+	      (++%2op ,term1 ,term2))))
+      (t (multiple-value-bind (constant-term non-constants)
+	     (loop for operand in operands
+		 if (movitz:movitz-constantp operand env)
+		 sum (movitz:movitz-eval operand env) into constant-term
+		 else collect operand into non-constant-operands
+		 finally (return (values constant-term non-constant-operands)))
+	   (cond
+	    ((null non-constants)
+	     constant-term)
+	    ((and (= 0 constant-term)
+		  (not (cdr non-constants)))
+	     (car non-constants))
+	    ((= 0 constant-term)
+	     `(+ (+ ,(first non-constants) ,(second non-constants)) ,@(cddr non-constants)))
+	    (t `(+ (+ ,constant-term ,(first non-constants)) ,@(cdr non-constants)))))))))
 
 (define-compiler-macro 1+ (number)
   `(+ 1 ,number))
@@ -256,7 +261,7 @@
 	     (case f1
 	       (0 `(progn ,factor2 0))
 	       (1 factor2)
-	       (2 `(let ((x ,factor2)) (+ x x)))
+	       (2 `(let ((x2 ,factor2)) (+ x2 x2)))
 	       (t `(no-macro-call * ,factor1 ,factor2)))))
 	  (t `(no-macro-call * ,factor1 ,factor2)))))
     (t `(* (* ,(first operands) ,(second operands)) ,@(cddr operands)))))




More information about the Movitz-cvs mailing list