Common Lisp中的反引号:读取和评估

莫比森

这个问题在一定程度上重新接种到这个这个对elisp的基本上,如何阅读和评估反引号?正在发生什么过程?标准对此有何规定?

这是我期望的,但不会发生:symbol`是读者宏,被翻译成某种(BACKQUOTE ...)宏/特殊形式(类似于'被翻译成(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中,此方法有效。

雷纳·乔斯维格

反引号

反引号Common Lisp中的标准宏字符

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

评估

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

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

Error: The variable C is unbound.

在Common LispEVAL中,使用动态环境和空词法环境来评估表单。在词汇环境之上,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默认情况下具有词法绑定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Common Lisp:在反引号中取消引用符号

来自分类Dev

在Common Lisp中快速读取CSV

来自分类Dev

在Common Lisp中在不带括号和引号的函数中使用符号参数

来自分类Dev

Jupyter和Common Lisp

来自分类Dev

(组成)在Common Lisp中

来自分类Dev

Common Lisp中的'()vs()

来自分类Dev

#ifndef在Common Lisp中

来自分类Dev

使用Common Lisp读取文件

来自分类Dev

使用Common Lisp读取文件

来自分类Dev

Common Lisp中的功能范围

来自分类Dev

更改-在Common Lisp中变为+

来自分类Dev

Common Lisp中的矩阵乘法

来自分类Dev

Common Lisp中的动态绑定

来自分类Dev

更改-在Common Lisp中变为+

来自分类Dev

Common Lisp中的功能范围

来自分类Dev

Common Lisp 中的变量范围

来自分类Dev

在emacs lisp中嵌套反引号和`

来自分类Dev

在 common lisp 中获取“common-lisp:setf common-lisp:list* 未定义”

来自分类Dev

Common Lisp中(loop for)和(loop:for)之间的区别

来自分类Dev

在Common Lisp和Let中修改哈希表

来自分类Dev

如何在Common Lisp中返回变量的值和名称

来自分类Dev

Common Lisp中的struct和class之间的区别

来自分类Dev

Common Lisp中的类的获取器和设置器

来自分类Dev

Racket和Common Lisp中顶级功能定义的规则顺序

来自分类Dev

如何在Common Lisp中遍历列表和范围?

来自分类Dev

Common Lisp中的函数名称和动态绑定

来自分类Dev

Common Lisp中(loop for)和(loop:for)之间的区别

来自分类Dev

如何在Common Lisp中实现短路的“和”宏?

来自分类Dev

如何在 Common Lisp 中删除字符串中的转义双引号?