使用反引号创建的 plist 在 let 表达式中失败

plist creating with backticks fails in let expression

我有一个双重问题,希望得到这里专家的指点。

1) 在对一些代码进行语法分析时,我需要将找到的组件存储起来以备后用。我现在考虑将它们存储为 属性 列表(一个孤立的列表,而不是包含代码的字符串之一,因为这在我看来是一种滥用,尽管它很方便)。这是否违反所有惯例或处理这种情况的合理方法?

2) 我无法在 (let ... ) 语句中创建 属性 列表。

这个有效:

(setq x "BAR")
(setq pl `(bar ,x))
(setq pl (plist-put pl 'foo "FOO"))
(plist-get pl 'foo)  ; returns "FOO"

但事实并非如此:

(let (pl `(bar ,x))
  (setq pl (plist-put pl 'foo "FOO"))
  (plist-get pl 'foo))

Emacs 抱怨函数栏无效。尽管有反引号,它显然会尝试评估 (bar ...) 。为什么?

因为缺少括号。让我们扩展特殊的反引号符号:

(let (pl (\` (bar (\, x))))
  (setq pl (plist-put pl 'foo "FOO"))
  (plist-get pl 'foo))

这声明了一个变量pl(没有初始值,因此初始化为nil)以及一个名为`的变量(没错:它的名字是"backtick")初始化为(bar (\, x)).

的值

因此,您想改写以下内容:

(let ((pl `(bar ,x)))
  ...)