[movitz-cvs] CVS movitz/losp/muerte

ffjeld ffjeld at common-lisp.net
Sat Mar 15 20:57:24 UTC 2008


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

Modified Files:
	basic-macros.lisp 
Log Message:
Have macros in the run-time.


--- /project/movitz/cvsroot/movitz/losp/muerte/basic-macros.lisp	2007/03/26 21:11:40	1.70
+++ /project/movitz/cvsroot/movitz/losp/muerte/basic-macros.lisp	2008/03/15 20:57:16	1.71
@@ -9,7 +9,7 @@
 ;;;; Created at:    Wed Nov  8 18:44:57 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: basic-macros.lisp,v 1.70 2007/03/26 21:11:40 ffjeld Exp $
+;;;; $Id: basic-macros.lisp,v 1.71 2008/03/15 20:57:16 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -28,29 +28,59 @@
 
 (in-package muerte)
 
-(defmacro defmacro (name lambda-list &body macro-body)
+(defmacro defmacro/cross-compilation (name lambda-list &body body)
   `(progn
-     (defmacro-compile-time ,name ,lambda-list ,macro-body)
-     #+ignore
-     (eval-when (:compile-toplevel)
-       (let ((name (intern (symbol-name ',name))))
-	 (when (eq (symbol-package name)
-		   (find-package 'muerte.common-lisp))
-	   ;; (warn "setting ~S" name)
-	   (setf (movitz:movitz-env-get name 'macro-expansion)
-	     (list* 'lambda ',lambda-list
-		    ',macro-body)))))
+     (defmacro-compile-time ,name ,lambda-list ,body)
      ',name))
 
+(defmacro defmacro (name lambda-list &body body)
+  `(defmacro/cross-compilation ,name ,lambda-list , at body))
+
+(defmacro defmacro/runtime (name lambda-list &body body)
+  (multiple-value-bind (real-body declarations docstring)
+      (movitz::parse-docstring-declarations-and-body body 'cl:declare)
+    (let* ((block-name (compute-function-block-name name))
+	   (ignore-var (gensym))
+	   (form-var (gensym "form-"))
+	   (env-var nil)
+	   (operator-var (gensym))
+	   (destructuring-lambda-list
+	    (do ((l lambda-list)
+		 (r nil))
+		((atom l)
+		 (cons operator-var
+		       (nreconc r l)))
+	      (let ((x (pop l)))
+		(if (eq x '&environment)
+		    (setf env-var (pop l))
+		    (push x r))))))
+      (multiple-value-bind (env-var ignore-env)
+	  (if env-var
+	      (values env-var nil)
+	      (let ((e (gensym)))
+		(values e (list e))))
+	`(make-named-function ,name
+			      (&edx edx &optional ,form-var ,env-var &rest ,ignore-var)
+			      ((ignore ,ignore-var , at ignore-env))
+			      ,docstring
+			      (block ,block-name
+				(verify-macroexpand-call edx ',name)
+				(destructuring-bind ,destructuring-lambda-list
+				    ,form-var
+				  (declare (ignore ,operator-var) , at declarations)
+				  , at real-body))
+			      :type :macro-function)))))
+
 (defmacro defun (function-name lambda-list &body body)
   "Define a function."
-;;;  (warn "defun ~S.." function-name)
   (multiple-value-bind (real-body declarations docstring)
       (movitz::parse-docstring-declarations-and-body body 'cl:declare)
     (let ((block-name (compute-function-block-name function-name)))
       `(progn
-	 (make-named-function ,function-name ,lambda-list
-			      ,declarations ,docstring
+	 (make-named-function ,function-name
+			      ,lambda-list
+			      ,declarations
+			      ,docstring
 			      (block ,block-name , at real-body))
 	 ',function-name))))
 
@@ -1078,7 +1108,7 @@
        (:halt)
        (:jmp ',infinite-loop-label))))
 
-(defmacro function-name-or-nil ()
+(define-compiler-macro function-name-or-nil ()
   (let ((function-name-not-found-label (gensym)))
     `(with-inline-assembly (:returns :eax)
        (:movl :edi :eax)




More information about the Movitz-cvs mailing list