首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在setf中使用条件位置

在setf中使用条件位置
EN

Stack Overflow用户
提问于 2013-05-11 16:40:18
回答 3查看 202关注 0票数 4

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

有可能让它这样工作吗?

代码语言:javascript
复制
(setf a1 5)
(setf a2 6)  
(setf
  (if (< a1 a2) a1 a2)
  nil
)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-11 18:15:14

如果你想做一些类似的事情,你可以使用(setf (symbol-value var) ...)

代码语言:javascript
复制
> (defparameter a1 5)
> (defparameter a2 6)
> (setf (symbol-value (if (< a1 a2) 'a1 'a2)) nil)
> a1
nil
> a2
6

要使语法更接近问题中的语法,可以为if定义一个setf-expander

代码语言:javascript
复制
(defsetf if (cond then else) (value)
     `(progn (setf (symbol-value (if ,cond ,then ,else)) ,value)
              ,value))

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

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

代码语言:javascript
复制
(if (< a1 a2) 
    (setf a1 nil)
    (setf a2 nil))
票数 9
EN

Stack Overflow用户

发布于 2013-05-11 18:13:24

不是,因为if表单不是一个位置,因此不能setf

票数 0
EN

Stack Overflow用户

发布于 2013-05-13 18:16:58

尽管它本身并不是很有用,但您可能希望将其视为一个小提示:

代码语言:javascript
复制
(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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16495341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档