最近,我一直在思考 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/