Lisp 在setf中使用条件位置
假设我有两个变量,我想将值较低的变量设置为nil 有可能这样做吗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) (如果(
(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))