gpt4 book ai didi

elisp - 我在这里缺少 make-symbol 和 assq 什么?

转载 作者:行者123 更新时间:2023-12-04 18:45:02 26 4
gpt4 key购买 nike

我正在尝试生成与 let 相同的结构块接受局部变量定义,但遇到了障碍:鉴于此 parse功能:

(defun parse (string)
(mapcar (lambda (line)
(let* ((k_v (split-string line "="))
(key (make-symbol (first k_v)))
(val (second k_v)))
(list key val)))
(split-string string "\n" t)))

我得到了 lisp-interaction-mode 中寻求的输出:
(setq alist (parse "foo=bar\nbaz=quux\n"))
((foo "bar") (baz "quux"))

鉴于…
(assq 'foo '((foo "bar") (baz "quux")))
(foo "bar")

…我希望下面的结果相同——我错过了什么?
(assq 'foo alist)
nil

如果 Emacs 版本重要,我会感到惊讶,但我一直在 OSX 上的 Emacs 24.2 (9.0) 中对此进行测试。

最佳答案

来自 make-symbol文档:

(make-symbol NAME)

Return a newly allocated uninterned symbol whose name is NAME.
Its value and function definition are void, and its property list is nil.


您的 assq正在比较内部符号 foo带有一些随机的 uninterned 符号,恰好被命名为 foo ,这(当然)会失败,因为它们不是同一个符号。

使用 intern而不是 make-symbol (如下)可能会解决您的问题。

(intern STRING &optional OBARRAY)

Return the canonical symbol whose name is STRING.
If there is none, one is created by this function and returned.
A second optional argument specifies the obarray to use;
it defaults to the value of `obarray'.

(defun parse (string)
(mapcar (lambda (line)
(let* ((k_v (split-string line "="))
(key (intern (first k_v))) ; change here
(val (second k_v)))
(list key val)))
(split-string string "\n" t)))
(intern "foo")返回内部符号 foo ,这将被添加到您的列表中,允许 (assq 'foo alist)工作得很好。

(在我的 Emacs 24.2.1 上在 Win7 上测试。)

关于elisp - 我在这里缺少 make-symbol 和 assq 什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16260019/

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