【问题标题】:plist creating with backticks fails in let expression使用反引号创建 plist 在 let 表达式中失败
【发布时间】:2016-03-29 16:00:16
【问题描述】:

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

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 抱怨 void 函数栏。尽管有反引号,它显然试图评估(bar ...)。为什么?

【问题讨论】:

    标签: emacs coding-style elisp let backticks


    【解决方案1】:

    因为没有括号。让我们扩展特殊的反引号:

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

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

    所以,你想改写如下:

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

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2012-06-28
      • 2019-08-12
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多