1 ;;;; tests related to setf
3 ;;;; This file is impure because we want to be able to use DEFUN.
5 ;;;; This software is part of the SBCL system. See the README file for
8 ;;;; While most of SBCL is derived from the CMU CL system, the test
9 ;;;; files (like this one) were written from scratch after the fork
12 ;;;; This software is in the public domain and is provided with
13 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
14 ;;;; more information.
19 (defun (setf foo
) (bar)
22 ;;; Regression test for get-setf-expansion without explicit
23 ;;; environment object.
24 (assert (multiple-value-list (get-setf-expansion '(foo))))
26 ;;; Regression test for SHIFTF of values.
29 (shiftf (values (car x
) (car y
)) (values (car y
) (car x
)))
30 (assert (equal (list x y
) '((2) (1)))))
32 ;;; SETF of values with multiple-value place forms
33 (let ((a t
) (b t
) (c t
) (d t
))
34 (let ((list (multiple-value-list
35 (setf (values (values a b
) (values c d
)) (values 1 2 3 4)))))
36 (assert (equal list
'(1 2)))
42 ;;; SETF of THE with VALUES.
44 (setf (the (values fixnum fixnum
) (values x y
))
49 ;;; SETF of MACRO-FUNCTION must accept a NIL environment
50 (let ((fun (constantly 'ok
)))
51 (setf (macro-function 'nothing-at-all nil
) fun
)
52 (assert (eq fun
(macro-function 'nothing-at-all nil
))))
55 ;;; DEFSETF accepts &ENVIRONMENT but not &AUX
56 (defsetf test-defsetf-env-1
(&environment env
) (new)
57 (declare (ignore new
))
58 (if (macro-function 'defsetf-env-trick env
)
62 (defsetf test-defsetf-env-2
(local global
&environment env
) (new)
63 (declare (ignore new
))
64 (if (macro-function 'defsetf-env-trick env
)
68 (assert (eq :local
(macrolet ((defsetf-env-trick ()))
69 (setf (test-defsetf-env-1) 13))))
71 (assert (eq :global
(setf (test-defsetf-env-1) 13)))
73 (assert (eq :local
(macrolet ((defsetf-env-trick ()))
74 (setf (test-defsetf-env-2 :local
:oops
) 13))))
76 (assert (eq :global
(setf (test-defsetf-env-2 :oops
:global
) 13)))
80 (eval '(defsetf test-defsetf-aux
(&aux aux
) (new) nil
))
84 (handler-bind ((style-warning #'error
))
85 (compile nil
'(lambda ()
86 (defsetf test-defsetf-no-env
(foo) (new)
87 `(set-foo ,foo
,new
))))
88 (compile nil
'(lambda ()
89 (defsetf test-defsetf-ignore-env
(foo &environment env
) (new)
90 (declare (ignore env
))
91 `(set-foo ,foo
,new
)))))
93 ;;; Not required by the spec, but allowes compiler-macros for SETF-functiosn
94 ;;; to see their constant argument forms.
95 (with-test (:name constantp-aware-get-setf-expansion
)
96 (multiple-value-bind (temps values stores set get
)
97 (get-setf-expansion '(foo 1 2 3))
100 (assert (equal `(funcall #'(setf foo
) ,@stores
1 2 3) set
))
101 (assert (equal '(foo 1 2 3) get
))))
103 (with-test (:name
:update-fn-should-be-a-symbol-in-defsetf
)
106 (eval '(defsetf access-fn
5))
110 (with-test (:name
:getf-unused-default-variable
)
111 (handler-bind ((style-warning #'error
))
112 (compile nil
`(lambda (x y
)
113 (setf (gethash :x x
0) 4)
114 (setf (getf y
:y
0) 4)
115 (setf (get 'z
:z
0) 4)))))