From: Nikodemus Siivola Date: Tue, 22 Aug 2006 17:01:39 +0000 (+0000) Subject: 0.9.15.47: compiler-macros for SETF functions X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=f76b45e1a3bb2008540e0db90b591c591315f129;p=sbcl.git 0.9.15.47: compiler-macros for SETF functions * ...already work, so remove the warning, and add a test --- diff --git a/NEWS b/NEWS index d87c5ec..671d259 100644 --- a/NEWS +++ b/NEWS @@ -12,7 +12,7 @@ changes in sbcl-0.9.16 relative to sbcl-0.9.15: * enhancement: SB-INTROSPECT is now able to find definitions of profiled functions. (thanks to Troels Henriksen) * enhancement: compiler-macro expansion applies now to FUNCALL forms - as well. + as well, allowing compiler-macros for SETF-functions to expand. * enhancement: step-instrumentation no longer wraps known single-value functions with multiple-value context, allowing better type inference. diff --git a/src/code/macros.lisp b/src/code/macros.lisp index 27535d6..e708663 100644 --- a/src/code/macros.lisp +++ b/src/code/macros.lisp @@ -113,22 +113,6 @@ invoked. In that case it will store into PLACE and start over." #!+sb-doc "Define a compiler-macro for NAME." (legal-fun-name-or-type-error name) - (when (consp name) - ;; It's fairly clear that the user intends the compiler macro to - ;; expand when he does (SETF (FOO ...) X). And that's even a - ;; useful and reasonable thing to want. Unfortunately, - ;; (SETF (FOO ...) X) macroexpands into (FUNCALL (SETF FOO) X ...), - ;; and it's not at all clear that it's valid to expand a FUNCALL form, - ;; and the ANSI standard doesn't seem to say anything else which - ;; would justify us expanding the compiler macro the way the user - ;; wants. So instead we rely on 3.2.2.1.3 "When Compiler Macros Are - ;; Used" which says they never have to be used, so by ignoring such - ;; macros we're erring on the safe side. But any user who does - ;; (DEFINE-COMPILER-MACRO (SETF FOO) ...) could easily be surprised - ;; by this way of complying with a rather screwy aspect of the ANSI - ;; spec, so at least we can warn him... - (sb!c::compiler-style-warn - "defining compiler macro of (SETF ...), which will not be expanded")) (when (and (symbolp name) (special-operator-p name)) (error 'simple-program-error :format-control "cannot define a compiler-macro for a special operator: ~S" diff --git a/tests/compiler.impure.lisp b/tests/compiler.impure.lisp index 86018e2..48b2028 100644 --- a/tests/compiler.impure.lisp +++ b/tests/compiler.impure.lisp @@ -1318,6 +1318,12 @@ (declare (inline test-cmacro-4)) (test-cmacro-4))))) +;;; SETF function compiler macros +(define-compiler-macro (setf test-cmacro-4) (&whole form value) ''ok) + +(assert (eq 'ok (funcall (lambda () (setf (test-cmacro-4) 'zot))))) +(assert (eq 'ok (funcall (lambda () (funcall #'(setf test-cmacro-4) 'zot))))) + ;;; Step instrumentation breaking type-inference (handler-bind ((warning #'error)) (assert (= 42 (funcall (compile nil '(lambda (v x) diff --git a/version.lisp-expr b/version.lisp-expr index 6b2a62c..0ddf1d4 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.15.46" +"0.9.15.47"