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

Sal*_*Egg 9 lisp eval quote

最近,我一直在思考Lisp的基础; 我在互联网上阅读了几本手册和/或其他材料,包括P. Graham 的Lisp of Roz:

Lisp的根中,quote被描述为将代码更改为数据的原语,从而引用它,但似乎没有等效的反向原语,即unquote原语.我认为它可能eval是业务,但eval经常在空词法环境中运行数据,这不等于将数据更改回代码.

Ergo,为什么不存在unquoteLisp原语?

Chr*_*ung 12

unquote仅在上下文中有用quasiquote,并且quasiquote可以实现为宏(quote在幕后使用).所以没有必要有unquote原语; 该quasiquote宏简单地涉及unquote符号,因为他们被发现.

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

`(foo bar ,baz)
Run Code Online (Sandbox Code Playgroud)

读作为

(quasiquote (foo bar (unquote baz)))
Run Code Online (Sandbox Code Playgroud)

在Scheme中.)


这是一个非常简单的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))))
Run Code Online (Sandbox Code Playgroud)

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

(define-syntax quasiquote
  (syntax-rules (unquote unquote-splicing)
    (`,datum
     datum)
    (`(,@datum . next)
     (append datum `next))
    (`(datum . next)
     (cons `datum `next))
    (`datum
     'datum)))
Run Code Online (Sandbox Code Playgroud)