4

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

有可能让它以这种方式工作吗?

(setf a1 5)
(setf a2 6)  
(setf
  (if (< a1 a2) a1 a2)
  nil
)
4

3 回答 3

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-expanderfor if

(defsetf if (cond then else) (value)
     `(progn (setf (symbol-value (if ,cond ,then ,else)) ,value)
              ,value))

然后你可以写(setf (if (< a1 a2) 'a1 'a2) nil)

但是,编写代码的最佳方式可能是直接进行,在两个分支中使用ifwithsetf形式:

(if (< a1 a2) 
    (setf a1 nil)
    (setf a2 nil))
于 2013-05-11T10:15:13.673 回答
0

不,因为那个if形式不是一个地方,因此不能setf

于 2013-05-11T10:13:24.063 回答
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))
于 2013-05-13T10:16:58.133 回答