1 ;;;; This file is for macroexpander tests which have side effects
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; While most of SBCL is derived from the CMU CL system, the test
7 ;;;; files (like this one) were written from scratch after the fork
10 ;;;; This software is in the public domain and is provided with
11 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
12 ;;;; more information.
14 ;;; From Matthew Swank on cll 2005-10-06
16 (defmacro defglobal
* (name &optional value
)
17 (let ((internal (gensym)))
19 (defparameter ,internal
,value
)
20 (define-symbol-macro ,name
,internal
))))
24 (assert (= (let ((glob 4)) glob
)))
26 (assert (equal (let ((glob nil
)) (setf glob
(cons 'foo glob
)) glob
) '(foo)))
28 (assert (equal (let ((glob nil
)) (push 'foo glob
) glob
) '(foo)))
33 ;;; CLHS 3.1.2.1.1 specifies that symbol macro expansion must also
34 ;;; go through *MACROEXPAND-HOOK*. (2007-09-22, -TCR.)
36 (define-symbol-macro .foo.
'foobar
)
38 (let* ((expanded-p nil
)
39 (*macroexpand-hook
* #'(lambda (fn form env
)
40 (when (eq form
'.foo.
)
42 (funcall fn form env
))))
43 (multiple-value-bind (expansion flag
) (macroexpand '.foo.
)
44 (assert (equal expansion
'(quote foobar
)))
49 (let ((sb-ext::*evaluator-mode
* :interpret
))
50 (let* ((expanded-p nil
)
51 (*macroexpand-hook
* #'(lambda (fn form env
)
52 (when (eq form
'.foo.
)
54 (funcall fn form env
))))
58 (let* ((expanded-p nil
)
59 (*macroexpand-hook
* #'(lambda (fn form env
)
60 (when (eq form
'/foo
/)
62 (funcall fn form env
))))
63 (compile nil
'(lambda ()
64 (symbol-macrolet ((/foo
/ 'foobar
))
65 (macrolet ((expand (symbol &environment env
)
66 (macroexpand symbol env
)))
70 ;; Check that DEFINE-SYMBOL-MACRO on a variable whose global :KIND
71 ;; was :ALIEN gets a sane error message instead of ECASE failure.
72 (sb-alien:define-alien-variable
("posix_argv" foo-argv
) (* (* char
)))
73 (handler-case (define-symbol-macro foo-argv
(silly))
75 (assert (string= "Symbol FOO-ARGV is already defined as an alien variable."
76 (write-to-string e
:escape nil
))))
77 (:no-error
() (error "Expected an error")))
79 (assert (equal (macroexpand-1
80 '(sb-int:binding
* (((foo x bar zz
) (f) :exit-if-null
)
82 (declare (integer x foo
) (special foo y
))
83 (declare (special zz bar l
) (real q foo
))
85 '(MULTIPLE-VALUE-BIND (FOO X BAR ZZ
) (F)
87 (INTEGER X FOO
) (SPECIAL FOO
) (SPECIAL ZZ BAR
) (REAL FOO
))
88 (WHEN FOO
(MULTIPLE-VALUE-BIND (BAZ Y
) (G BAR
)
90 (DECLARE (SPECIAL L
) (REAL Q
)) (THING))))))
92 (assert (equal (macroexpand-1
93 '(sb-int:binding
* (((x y
) (f))
97 '(MULTIPLE-VALUE-BIND (X Y
) (F)