【发布时间】:2012-04-06 10:20:12
【问题描述】:
现在可以正常工作了:
(setq al '((a . "1") (b . "2")))
(assq-delete-all 'a al)
但我在我的应用程序中使用字符串作为键:
(setq al '(("a" . "foo") ("b" . "bar")))
这没有做任何事情:
(assq-delete-all "a" al)
我认为这是因为字符串对象实例不同(?)
那么我应该如何从关联列表中删除带有字符串键的元素呢?或者我应该放弃并使用符号作为键,并在需要时将它们转换为字符串?
【问题讨论】:
-
顺便说一句,你需要将
assq-delete-all的结果分配回变量,即使它是破坏性操作:(setq al (assq-delete-all 'a al))。如果列表为空怎么办?al必须取值 nil:这将如何发生?或者,如果您删除第一个元素,即al最初指向的头部缺点怎么办?al必须更新才能跳到第二个单元格。 -
为了完整起见,要按值(和/或键)删除,您也可以使用
seq-remove或cl-remove(-if)。这仅返回“过滤”列表,因此要更新值,您应该使用setq更新原始值(始终推荐/更安全,在使用像delete这样的“破坏性”操作时也是如此;至少是这样的根据 Paul Graham 所说,在 Common-Lisp 中;他在一本书或多本书中提到了这一点)。