gpt4 book ai didi

lisp - 为什么没有 `unquote` Lisp 原语?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:26 27 4
gpt4 key购买 nike

最近,我一直在思考 Lisp 的基础;我在 Internet 上阅读了几本手册和/或其他 Material ,包括 The Roots of Lisp作者:P. Graham:

Lisp 的根源 中,quote 被描述为将代码更改为数据的原语,从而引用它,但是没有t 似乎是一个等效的逆原语,即 unquote 原语。我以为这可能是 eval 的事,但 eval 经常在 null 词法环境中运行数据,这不等同于将数据改回代码。

因此,为什么没有 unquote Lisp 原语?

最佳答案

unquote 仅在 quasiquote 的上下文中有用,并且 quasiquote 可以实现为宏(使用 quote 幕后)。所以不需要 unquote 原语; quasiquote 宏只处理找到的 unquote 符号。

(quasiquote 是反引号的 Scheme 名称。因此:

`(foo bar ,baz)

读入为

(quasiquote (foo bar (unquote baz)))

在方案中。)


这是一个非常简单的 Scheme quasiquote 宏(它只处理列表,不像标准的 quasiquote 也处理向量和其他数据类型):

(define-syntax quasiquote
(syntax-rules (unquote unquote-splicing)
((quasiquote (unquote datum))
datum)
((quasiquote ((unquote-splicing datum) . next))
(append datum (quasiquote next)))
((quasiquote (datum . next))
(cons (quasiquote datum) (quasiquote next)))
((quasiquote datum)
(quote datum))))

使用所有标准阅读器缩写的等效版本:

(define-syntax quasiquote
(syntax-rules (unquote unquote-splicing)
(`,datum
datum)
(`(,@datum . next)
(append datum `next))
(`(datum . next)
(cons `datum `next))
(`datum
'datum)))

关于lisp - 为什么没有 `unquote` Lisp 原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18515295/

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