使用反引号创建的plist在let

时间:2016-03-29 16:00:17

标签: emacs coding-style elisp let backticks

我有一个双重问题,希望得到专家的建议。

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 ...)。为什么呢?

1 个答案:

答案 0 :(得分:2)

缺少括号。让我们扩展特殊的反引号表示法:

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

这声明了一个变量pl(没有初始值,因此初始化为nil)以及一个名为`(正确:它的名称是“反引号”)的变量初始化为该值(bar (\, x))

因此,您想要编写以下内容:

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