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

标签 lisp eval quote

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

相关文章:

lambda - 为什么在 lambda 中使用#'?

lisp - Quicklisp 使用 sbcl : getting UNDEFINED-FUNCTION error when loading various libraries

Javascript:IE8 中的 eval 行为

python - 使用 python 的 eval() 与 ast.literal_eval()

asp.net - 使用 Eval 和 Substring 在 GridView 中剪切一个字段

bash - 如何按原样打印 bash 脚本中的输入参数

common-lisp - 普通 lisp 中的 #'

lambda - Simply Scheme 第 09 章。Lambda。还有更多的 Lambda 练习吗?

宏与函数

list - 使用 Scheme 递归添加到列表