【问题标题】:Backquote in Common Lisp: read and evalCommon Lisp 中的反引号:read 和 eval
【发布时间】:2016-03-05 10:47:06
【问题描述】:

这个问题在某种程度上被改写为thisthis for Elisp。基本上,如何阅读和评估反引号?正在发生什么过程?标准对此有什么说明吗?

这是我所期望的,但不会发生:符号`是一个阅读器宏,被翻译成某种(BACKQUOTE ...)宏/特殊形式(类似于@987654325 @被翻译成(QUOTE ...))。这不会发生,事实上,Common Lisp 甚至没有 BACKQUOTE 宏。

发生了什么(SBCL):

CL-USER> (defparameter *q* (read-from-string "`(a b ,c)"))
*Q*
CL-USER> *q*
`(A B ,C)
CL-USER> (car *q*)
SB-INT:QUASIQUOTE
CL-USER> (cdr *q*)
((A B ,C))

与预期不同,但还可以。现在,,C 本身就是一只有趣的野兽:

CL-USER> (type-of (third (cadr *q*)))
SB-IMPL::COMMA

如果没有逗号符号,评估读取表达式就可以了:

CL-USER> (eval (read-from-string "`(a b c)"))
(A B C)

但如果我想评估原始表达式,即使使用C 的本地绑定,也会出现问题:

(let ((c 10)) (eval (read-from-string "`(a b ,c)")))
; in: LET ((C 10))
;     (LET ((C 10))
;       (EVAL (READ-FROM-STRING "`(a b ,c)")))
; 
; caught STYLE-WARNING:
;   The variable C is defined but never used.
; 
; compilation unit finished
;   caught 1 STYLE-WARNING condition
; Evaluation aborted on #<UNBOUND-VARIABLE C {1007A3B2F3}>.

这意味着EVAL 没有选择绑定C 的环境。

PS。有趣的是,在 Elisp 中这是可行的。

【问题讨论】:

  • @RainerJoswig 是“标准宏字符”和“阅读器宏”相同的东西还是我对它们感到困惑?
  • '标准宏字符'表示一个字符是标准定义的宏字符。 CLHS 词汇表:宏字符 n。一个字符,当 Lisp 阅读器在其主调度循环中遇到时,会引入一个阅读器宏。
  • 有关技术细节,您还可以查看您的实现如何操作准引号以及Faré quasiquotes

标签: lisp elisp common-lisp reader-macro


【解决方案1】:

反引号

Backquote 是 Common Lisp 中的标准 macro character

在 Common Lisp 中,反引号表达式的表示是未定义的。实现实际上使用不同的表示。您看到的 SBCL 是特定于实现的。

评估

eval 的问题与阅读器或反引号表达式完全无关:

? (let ((c 10))
    (eval '(list 'a 'b c)))

Error: The variable C is unbound.

在 Common Lisp 中,EVAL 使用动态环境和null lexical environment 来评估表单。上面的词法环境,其中c 绑定到10,没有使用。

但动态绑定是。我们需要将变量声明为special

? (let ((c 10))
    (declare (special c))
    (eval '(list 'a 'b c)))
(A B 10)

因此这也有效:

? (let ((c 10))
    (declare (special c))
    (eval (read-from-string "`(a b ,c)")))
(A B 10)

Emacs Lisp 默认有/有动态绑定(尽管 GNU Emacs 现在也支持词法绑定)。 Common Lisp 默认有词法绑定。

【讨论】:

  • 我不知道EVAL 使用空词法环境。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多