;;; SETF of values with multiple-value place forms
(let ((a t) (b t) (c t) (d t))
(let ((list (multiple-value-list
- (setf (values (values a b) (values c d)) (values 1 2 3 4)))))
+ (setf (values (values a b) (values c d)) (values 1 2 3 4)))))
(assert (equal list '(1 2)))
(assert (eql a 1))
(assert (eql c 2))
(assert (= x 1))
(assert (= y 2)))
+;;; SETF of MACRO-FUNCTION must accept a NIL environment
+(let ((fun (constantly 'ok)))
+ (setf (macro-function 'nothing-at-all nil) fun)
+ (assert (eq fun (macro-function 'nothing-at-all nil))))
+
+
+;;; DEFSETF accepts &ENVIRONMENT but not &AUX
+(defsetf test-defsetf-env-1 (&environment env) (new)
+ (declare (ignore new))
+ (if (macro-function 'defsetf-env-trick env)
+ :local
+ :global))
+
+(defsetf test-defsetf-env-2 (local global &environment env) (new)
+ (declare (ignore new))
+ (if (macro-function 'defsetf-env-trick env)
+ local
+ global))
+
+(assert (eq :local (macrolet ((defsetf-env-trick ()))
+ (setf (test-defsetf-env-1) 13))))
+
+(assert (eq :global (setf (test-defsetf-env-1) 13)))
+
+(assert (eq :local (macrolet ((defsetf-env-trick ()))
+ (setf (test-defsetf-env-2 :local :oops) 13))))
+
+(assert (eq :global (setf (test-defsetf-env-2 :oops :global) 13)))
+
+(assert (eq :error
+ (handler-case
+ (eval '(defsetf test-defsetf-aux (&aux aux) (new) nil))
+ (error ()
+ :error))))
+
+(handler-bind ((style-warning #'error))
+ (compile nil '(lambda ()
+ (defsetf test-defsetf-no-env (foo) (new)
+ `(set-foo ,foo ,new))))
+ (compile nil '(lambda ()
+ (defsetf test-defsetf-ignore-env (foo &environment env) (new)
+ (declare (ignore env))
+ `(set-foo ,foo ,new)))))
+
;;; success
-(quit :unix-status 104)