假设我有两个变量,我想将值较低的变量设置为nil。
是否有可能以这种方式工作?
(setf a1 5)
(setf a2 6)
(setf
(if (< a1 a2) a1 a2)
nil
)
答案 0 :(得分:9)
如果您想做一些与此相近的事情,可以使用(setf (symbol-value var) ...)
:
> (defparameter a1 5)
> (defparameter a2 6)
> (setf (symbol-value (if (< a1 a2) 'a1 'a2)) nil)
> a1
nil
> a2
6
要使语法更接近问题中的语法,您可以为setf-expander
定义if
:
(defsetf if (cond then else) (value)
`(progn (setf (symbol-value (if ,cond ,then ,else)) ,value)
,value))
然后你可以写(setf (if (< a1 a2) 'a1 'a2) nil)
然而,编写代码的最佳方式可能是直接执行,在两个分支中使用if
setf
形式:
(if (< a1 a2)
(setf a1 nil)
(setf a2 nil))
答案 1 :(得分:0)
不,因为if
表单不是地方,因此不能setf
。
答案 2 :(得分:0)
虽然它本身并不是很有用,但您可能希望将其视为一个小提示:
(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))