我在修改关联列表的条目时遇到问题。当我运行此代码时
示例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")))
答案 0 :(得分:4)
在 letn 表达式中,变量条目包含关联的副本,而不是引用。直接设置关联,如Cormullion的例子所示:
(setf (assoc key Dict) (list key "new value"))
在newLISP编程模型中,所有内容只能引用一次。作业总是复制。
答案 1 :(得分: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"))))