gpt4 book ai didi

emacs - 在emacs lisp中嵌套反引号和`

转载 作者:行者123 更新时间:2023-12-04 04:30:56 28 4
gpt4 key购买 nike

短反引号和长反引号之间似乎有些区别。

(let ((x 123))
(dolist (res (list `(a `(b ,x))
`(a (backquote (b ,x)))
(backquote (a (backquote (b ,x))))
(backquote (a `(b ,x)))))
(print res)))

输出:
(a (\` (b (\, x))))

(a (backquote (b 123)))

(a (backquote (b 123)))

(a (\` (b (\, x))))

为什么它的行为与x不同?甚至不确定四个结果中的哪两个应该是令人惊讶的结果。

最佳答案

我不确定这是bug还是功能,主要是因为我不确定是否允许elisp程序员/良好实践使用backquote函数,或者这只是定义函数的便捷方式。正确的输出是第一(和第四)输出。查看backquote的代码(位于backquote.el中),很显然,`或backquote中的任何backquote均未正确扩展。有关的代码是:

   ((eq (car s) backquote-backquote-symbol)
(backquote-delay-process s (1+ level)))

其中 backquote-backquote-symbol之前被定义为'\`(quote-backslash-backtick)。有几种处理此错误的方法,但是可能是:
   ((or (eq (car s) backquote-backquote-symbol)
(eq (car s) 'backquote))
(backquote-delay-process s (1+ level)))

(或使用任何其他变量来指定反引号未混淆的符号)。

编辑:仔细观察,您还必须在另一个地方添加该测试,但这包括报告补丁。我会看看我该怎么做。有了这个变化:
ELISP> (macroexpand-all `(a (backquote (b ,x))))
(a
(list 'b x))
ELISP> (macroexpand-all `(a `(b ,x)))
(a
(list 'b x))

关于emacs - 在emacs lisp中嵌套反引号和`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17394638/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com