首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常见Lisp中的反向引号:读和法

常见Lisp中的反向引号:读和法
EN

Stack Overflow用户
提问于 2016-03-05 10:47:06
回答 1查看 533关注 0票数 5

这个问题在某种程度上回答了thisthis for Elisp。基本上,反向报价是如何阅读和评估的?正在发生什么过程?标准上说了什么吗?

这里是我所期望的,但是没有发生:符号is a reader-macro and is translated into some kind of(BACKQUOTE .)macro/special form (similarly tobeing translated to(引号.)). This doesn't happen, and, in fact, Common Lisp doesn't even have aBACKQUOTE宏。

正在发生的事情(SBCL):

代码语言:javascript
复制
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本身就是一只有趣的野兽:

代码语言:javascript
复制
CL-USER> (type-of (third (cadr *q*)))
SB-IMPL::COMMA

如果没有逗号符号,则计算读取表达式的值是可以的:

代码语言:javascript
复制
CL-USER> (eval (read-from-string "`(a b c)"))
(A B C)

但是,如果我想计算原始表达式,即使使用C的本地绑定,也有一个问题:

代码语言:javascript
复制
(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中,这是可行的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-05 11:07:17

反向报价

Backquote是公共Lisp中的标准macro character

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

EVAL

eval的问题与读取器或反向引用表达式完全无关:

代码语言:javascript
复制
? (let ((c 10))
    (eval '(list 'a 'b c)))

Error: The variable C is unbound.

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

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

代码语言:javascript
复制
? (let ((c 10))
    (declare (special c))
    (eval '(list 'a 'b c)))
(A B 10)

因此,这也适用于:

代码语言:javascript
复制
? (let ((c 10))
    (declare (special c))
    (eval (read-from-string "`(a b ,c)")))
(A B 10)

默认情况下,Emacs具有/具有动态绑定(尽管GNU现在也支持词法绑定)。默认情况下,公共Lisp具有词法绑定。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35813139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档