首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >newLISP:修改关联列表

newLISP:修改关联列表
EN

Stack Overflow用户
提问于 2012-11-15 12:12:30
回答 2查看 167关注 0票数 1

我在修改关联列表的条目时遇到了问题。当我运行这段代码时

示例A

代码语言:javascript
复制
(set 'Dict '(("foo" "bar")))

(letn (key "foo"
       entry (assoc key Dict))
  (setf (assoc key Dict) (list key "new value")))

(println Dict)

结果是:

代码语言:javascript
复制
(("foo" "new value")) ; OK

这是意料之中的。用这个代码

示例B

代码语言:javascript
复制
(set 'Dict '(("foo" "bar")))

(letn (key "foo"
       entry (assoc key Dict))
  (setf entry (list key "new value"))) ; the only change is here

(println Dict)

结果是:

代码语言:javascript
复制
(("foo" "bar")) ; huh?

为什么在第二种情况下没有更新Dict

编辑

我想要的是检查条目是否在Dict中,如果是的话--更新它,否则就别管它了。使用letn,我希望避免重复的代码

代码语言:javascript
复制
(letn (key "foo"
       entry (assoc key Dict))
  (if entry ; update only if the entry is there
    (setf entry (list key "new value")))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-15 14:04:04

letn表达式中,变量条目包含关联的副本,而不是引用。直接设置关联,如Cormullion的示例所示:

代码语言:javascript
复制
(setf (assoc key Dict) (list key "new value"))

在newLISP编程模型中,一切都只能引用一次。作业总是复制一份。

票数 4
EN

Stack Overflow用户

发布于 2012-11-15 13:20:06

我对协会名单的理解是,它们是这样工作的:

代码语言:javascript
复制
> (set 'data '((apples 123) (bananas 123 45) (pears 7)))
((apples 123) (bananas 123 45) (pears 7))
> (assoc 'pears data)
(pears 7)
> (setf (assoc 'pears data) '(pears 8))
(pears 8)
> data
((apples 123) (bananas 123 45) (pears 8))
> (assoc 'pears data)
(pears 8)
>

如果要检查键是否存在并更新其值,请执行以下操作:

代码语言:javascript
复制
(letn (key "foo")
   (if (lookup key Dict)
       (setf (assoc key Dict) (list key "new value"))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13397316

复制
相关文章

相似问题

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