SB-SIMD-PACK on x86-64
[sbcl.git] / tests / macroexpand.impure.lisp
index 6f5863d..3df0bdd 100644 (file)
 
 ;;; From Matthew Swank on cll 2005-10-06
 
 
 ;;; From Matthew Swank on cll 2005-10-06
 
-(defmacro defglobal (name &optional value)
+(defmacro defglobal* (name &optional value)
   (let ((internal (gensym)))
     `(progn
        (defparameter ,internal ,value)
        (define-symbol-macro ,name ,internal))))
 
   (let ((internal (gensym)))
     `(progn
        (defparameter ,internal ,value)
        (define-symbol-macro ,name ,internal))))
 
-(defglobal glob)
+(defglobal* glob)
 
 (assert (= (let ((glob 4)) glob)))
 (assert (null glob))
 
 (assert (= (let ((glob 4)) glob)))
 (assert (null glob))
 (assert (null glob))
 (assert (equal (let ((glob nil)) (push 'foo glob) glob) '(foo)))
 (assert (null glob))
 (assert (null glob))
 (assert (equal (let ((glob nil)) (push 'foo glob) glob) '(foo)))
 (assert (null glob))
+
+
+
+;;; CLHS 3.1.2.1.1 specifies that symbol macro expansion must also
+;;; go through *MACROEXPAND-HOOK*. (2007-09-22, -TCR.)
+
+(define-symbol-macro .foo. 'foobar)
+
+(let* ((expanded-p nil)
+      (*macroexpand-hook* #'(lambda (fn form env)
+                              (when (eq form '.foo.)
+                                (setq expanded-p t))
+                              (funcall fn form env))))
+  (multiple-value-bind (expansion flag) (macroexpand '.foo.)
+    (assert (equal expansion '(quote foobar)))
+    (assert flag)
+    (assert expanded-p)))
+
+#+sb-eval
+(let ((sb-ext::*evaluator-mode* :interpret))
+  (let* ((expanded-p nil)
+         (*macroexpand-hook* #'(lambda (fn form env)
+                                 (when (eq form '.foo.)
+                                   (setq expanded-p t))
+                                 (funcall fn form env))))
+    (eval '.foo.)
+    (assert expanded-p)))
+
+(let* ((expanded-p nil)
+       (*macroexpand-hook* #'(lambda (fn form env)
+                               (when (eq form '/foo/)
+                                 (setq expanded-p t))
+                               (funcall fn form env))))
+  (compile nil '(lambda ()
+                 (symbol-macrolet ((/foo/ 'foobar))
+                   (macrolet ((expand (symbol &environment env)
+                                (macroexpand symbol env)))
+                     (expand /foo/)))))
+  (assert expanded-p))