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

标签 elisp

我正在尝试生成与 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/

相关文章:

emacs - 第一次 elisp 尝试 - Tab 键未在选项卡上调用的次要模式?

emacs - 如何用elisp代码注释掉sexps?

vim - Emacs的Command-T?

emacs - 有没有办法在 Emacs 中自动关闭文件名完成缓冲区?

Emacs Helm 完成 : how to turn off persistent-help_line?

方案和 Lisp 最佳实践 : recursion yes for Scheme, Lisp 没有?

emacs lisp 和 c 模式 : when am I in a comment region

emacs 绑定(bind)键插入另一个

emacs - 使用 Emacs 缩进(移位 4)代码

emacs - 无法将目录及其所有子目录添加到 Emacs 中的加载路径