最近,我一直在思考Lisp的基础;我在网上阅读了一些手册和/或其他材料,包括P.Graham的The Roots of Lisp
在Lisp的根中,quote被描述为一个将代码转换为数据的原语,从而引用它,但是似乎没有等效的逆原语,即unquote原语我认为它可能是eval的业务,但是eval经常将数据运行在空的词汇环境中,这不等同于将数据更改为代码。
那么,为什么没有一个unquotelisp原语?

最佳答案

unquote仅在quasiquote的上下文中有用,并且quasiquote可以作为宏实现(在幕后使用quote)因此不需要有一个unquote原语;quasiquote宏只处理找到的unquote符号。
quasiquote是反勾引号的方案名称因此:

`(foo bar ,baz)

作为
(quasiquote (foo bar (unquote baz)))

在计划中。)
这里有一个非常简单的Schemequasiquote宏(它只处理列表,不像standardquasiquote也处理向量和其他数据类型):
(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)))

07-26 02:38