2
;;;; Author: Paul Dietz
3
;;;; Created: Mon Oct 7 19:20:17 2002
4
;;;; Contains: Tests of various kinds of places (section 5.1)
11
(let ((x (vector nil nil nil nil))
13
(setf (aref x (incf i)) (incf i))
18
(let ((x (vector nil nil nil nil))
20
(setf (aref x (incf i)) (incf i)
21
(aref x (incf i)) (incf i 10))
26
(let ((x (copy-seq #(0 0 0 0 0)))
29
(incf (aref x (incf i)) (incf i))
34
(let ((x (copy-seq #(0 0 0 0 0)))
37
(decf (aref x (incf i)) (incf i))
50
;;; See SETF forms at various accessor functions
53
(deftest setf-values.1
54
(let ((x nil) (y nil) (z nil))
55
(setf (values x y z) (values 1 2 3)))
58
(deftest setf-values.2
59
(let ((x nil) (y nil) (z nil))
60
(setf (values x y z) (values 1 2 3))
64
(deftest setf-values.3
65
(let ((x nil) (y nil) (z nil))
66
(setf (values x x x) (values 1 2 3))
70
;;; Test that the subplaces of a VALUES place can be
71
;;; complex, and that the various places' subforms are
72
;;; evaluated in the correct (left-to-right) order.
74
(deftest setf-values.4
75
(let ((x (list 'a 'b)))
76
(setf (values (car x) (cadr x)) (values 1 2))
80
(deftest setf-values.5
81
(let ((a (vector nil nil))
84
(setf (values (aref a (progn (setf x (incf i)) 0))
85
(aref a (progn (setf y (incf i)) 1)))
92
(deftest setf-values.6
93
(setf (values) (values)))
98
(setf (the integer x) 2)
105
(setf (the symbol (car x)) 'b)
110
(deftest setf-apply.1
111
(let ((x (vector 0 1 2 3 4 5)))
112
(setf (apply #'aref x '(0)) 10)
116
(deftest setf-apply.2
117
(let ((a (make-array '(2 2) :initial-contents '((0 0)(0 0)))))
118
(setf (apply #'aref a 1 1 nil) 'a)
119
(equalp a (make-array '(2 2) :initial-contents '((0 0)(0 a)))))
122
(deftest setf-apply.3
123
(let ((bv (copy-seq #*0000000000)))
124
(setf (apply #'bit bv 4 nil) 1)
128
(deftest setf-apply.4
129
(let ((bv (copy-seq #*0000000000)))
130
(setf (apply #'sbit bv 4 nil) 1)
135
(defun accessor-5-1-2-6-update-fn (x y)
139
(defsetf accessor-5-1-2-6 accessor-5-1-2-6-update-fn)
141
(deftest setf-expander.1
143
(values (setf (accessor-5-1-2-6 x) 2)
149
(defmacro accessor-5-1-2-7 (x) `(car ,x))
150
(deftest setf-macro.1
152
(values (setf (accessor-5-1-2-7 x) 2)
156
(defun accessor-5-1-2-7a-update-fn (x y)
157
(declare (special *x*))
162
(defmacro accessor-5-1-2-7a (x) `(car ,x))
163
(defsetf accessor-5-1-2-7a accessor-5-1-2-7a-update-fn)
164
;; Test that the defsetf override the macro expansion
165
(deftest setf-macro.2
168
(declare (special *x*))
169
(values (setf (accessor-5-1-2-7a x) 2)
174
(defmacro accessor-5-1-2-7b (x) `(accessor-5-1-2-7 ,x))
175
;; Test that the macroexpansion occurs more than once
176
(deftest setf-macro.3
178
(values (setf (accessor-5-1-2-7b x) 2)
182
;; Macroexpansion from a macrolet
183
(deftest setf-macro.4
184
(macrolet ((%m (y) `(car ,y)))
186
(values (setf (%m x) 2)
190
;;; section 5.1.2.8 -- symbol macros
191
(deftest setf-symbol-macro.1
192
(symbol-macrolet ((x y))
194
(values (setf x 1) x y)))
197
;;; Symbol macros in SETQs are treated as if the form were a SETF
198
(deftest setf-symbol-macro.2
199
(symbol-macrolet ((x y))
201
(values (setq x 1) x y)))
204
;;; Tests that, being treated like SETF, this causes multiple values
205
;;; to be assigned to (values y z)
206
(deftest setf-symbol-macro.3
207
(symbol-macrolet ((x (values y z)))
208
(let ((y nil) (z nil))
209
(values (setq x (values 1 2)) x y z)))
218
(values (setq x 1 y 2) x y))
223
(values (setq x (values 1 3) y (values 2 4)) x y))
227
(let (x) (setq x (values 1 2)))
232
(declare (special *x*))
233
(values *x* (setq *x* 1) *x*))
238
(declare (special *x*))
249
(values (setf x 1 y 2) x y))
254
(values (setf x (values 1 3) y (values 2 4)) x y))
258
(let (x) (setf x (values 1 2)))
263
(declare (special *x*))
264
(values *x* (setf *x* 1) *x*))
269
(declare (special *x*))