0.9.15.47: compiler-macros for SETF functions
authorNikodemus Siivola <nikodemus@random-state.net>
Tue, 22 Aug 2006 17:01:39 +0000 (17:01 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Tue, 22 Aug 2006 17:01:39 +0000 (17:01 +0000)
 * ...already work, so remove the warning, and add a test

NEWS
src/code/macros.lisp
tests/compiler.impure.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index d87c5ec..671d259 100644 (file)
--- 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.
index 27535d6..e708663 100644 (file)
@@ -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"
index 86018e2..48b2028 100644 (file)
                               (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)
index 6b2a62c..0ddf1d4 100644 (file)
@@ -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"