Lisp 在setf中使用条件位置

Lisp 在setf中使用条件位置,lisp,common-lisp,Lisp,Common Lisp,假设我有两个变量,我想将值较低的变量设置为nil 有可能这样做吗 (setf a1 5) (setf a2 6) (setf (if (< a1 a2) a1 a2) nil ) (setf a1 5) (setf a2 6) (setf) (如果(

假设我有两个变量,我想将值较低的变量设置为nil

有可能这样做吗

(setf a1 5)
(setf a2 6)  
(setf
  (if (< a1 a2) a1 a2)
  nil
)
(setf a1 5)
(setf a2 6)
(setf)
(如果(
不,因为
如果
表单不是一个位置,因此无法
setf

如果您想做类似的事情,可以使用
(setf(符号值变量)…)

然后您可以编写
(setf(如果(

但是,编写代码的最佳方法可能是直接编写,在两个分支中使用
if
setf
表单:

(if (< a1 a2) 
    (setf a1 nil)
    (setf a2 nil))
(如果(
虽然它本身不是很有用,但您可能希望将其视为一个小提示:

(defun new-values (x y)
  (if (< x y) (values nil y) (values x nil)))

(setf a1 5)
(setf a2 6)  
(setf (values a1 a2) (new-values a1 a2))
(定义新值(x y)
(如果(
AFAIR,CL规范不允许为标准函数/宏/特殊运算符定义SETF。@monoid部分正确。第11.1.2.1.2节说,在COMMON-LISP包中为符号定义集合扩展器的后果是未定义的。好吧,这不是“不允许”,而是“你不应该”:)谢谢你,确实更聪明的做法是将
setf
s放入
if
。。。但在某些情况下,这可能更容易阅读:)
(if (< a1 a2) 
    (setf a1 nil)
    (setf a2 nil))
(defun new-values (x y)
  (if (< x y) (values nil y) (values x nil)))

(setf a1 5)
(setf a2 6)  
(setf (values a1 a2) (new-values a1 a2))