gpt4 book ai didi

emacs - 您如何确保关联列表在 Emacs 中维护唯一键

转载 作者:行者123 更新时间:2023-12-04 22:12:24 27 4
gpt4 key购买 nike

鉴于将键添加到关联列表(如 auto-mode-alist )的频率,我认为有一些惯用的方法可以使用唯一键维护关联列表,但尚未遇到它。

假设我执行以下操作:

(setq alist '())
(add-to-list 'alist '(a . 1))
(add-to-list 'alist '(a . 2))
(add-to-list 'alist '(b . 3))

运行之后, alist 包含 ((b . 3) (a . 2) (a . 1)) 。我看到 add-to-list 可以采用可选的 compare-fn ,所以我认为我可以通过一些方法来获得 ((b . 3) (a . 1)) 作为结果。我也知道我可以为此使用哈希表,但很好奇如何使用关联列表惯用地做到这一点。

最佳答案

没有要求关联列表具有唯一键,如您的示例所示,也没有任何特别的理由期望它们具有唯一键 - 基本上,它只是一个列表列表,对嵌套列表的 car 没有限制.

我相信利用这样一个事实是惯用的,即通过将新对推到列表的前面来覆盖初始键/值对的键没有限制。 alists 的一些核心功能在这些方面隐含地工作。例如,这里是 assoc 的文档字符串:

Return non-nil if KEY is `equal' to the car of an element of LIST.
The value is actually the first element of LIST whose car equals KEY.

因此,它只返回第一个元素,而不管列表后面有多少具有相同键的其他元素。这可能是一个非常有用的功能。

更新。如果你真的想防止 add-to-list 隐藏先前的键/值对(尽管你这样做是在与语言作斗争),你可以定义以下函数并将其传递给 compare-fn 中的 add-to-list 参数(注意它确实零错误检查):
(defun key-used-p (elt1 elt2)
"Helper function for add-to-list: returns non-nil if key is
already in use in an association list."
(eq (car elt1) (car elt2)))

(setq alist '((a . 1) (b . 1) (c . 1))) ; original list
(add-to-list 'alist '(a . 2) nil #'key-used-p) ; adds nothing because a in use
(add-to-list 'alist '(d . 2) nil #'key-used-p) ; adds (d . 2)

关于emacs - 您如何确保关联列表在 Emacs 中维护唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com