1

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

示例 A

(set 'Dict '(("foo" "bar")))

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

(println Dict)

结果是:

(("foo" "new value")) ; OK

这是预期的。使用此代码

示例 B

(set 'Dict '(("foo" "bar")))

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

(println Dict)

结果是:

(("foo" "bar")) ; huh?

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

编辑

我想要的是检查一个条目是否在其中Dict,如果是 - 更新它,否则不要管它。我letn想避免重复的代码

(letn (key "foo"
       entry (assoc key Dict))
  (if entry ; update only if the entry is there
    (setf entry (list key "new value")))
4

2 回答 2

4

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

(setf (assoc key Dict) (list key "new value"))

在 newLISP 编程模型中,所有内容都只能被引用一次。作业总是制作副本。

于 2012-11-15T14:04:04.487 回答
2

我对关联列表的理解是它们是这样工作的:

> (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)
>

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

(letn (key "foo")
   (if (lookup key Dict)
       (setf (assoc key Dict) (list key "new value"))))
于 2012-11-15T13:20:06.910 回答