现在这个很好地运行了:
(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
最初指向的头部cons的指针必须更新以跳过第二个单元格。 - Kazseq-remove
或cl-remove(-if)
。 这仅返回“过滤”列表,因此要更新值,您应该使用setq
更新原始值(这总是建议的/更安全的方式,即使在使用“破坏性”操作如delete
时也是如此;至少在Common-Lisp中是这样的,根据Paul Graham的说法; 他在他的一本或多本书中提到了这一点)。 - dalanicolai