gpt4 book ai didi

scheme - 取消引用准引用点对中的项目

转载 作者:行者123 更新时间:2023-12-02 03:52:35 25 4
gpt4 key购买 nike

我已经开始尝试学习 Scheme 评估的内部结构,而准引用、取消引用、评估和 cons-cells 的一个方面让我感到困惑。如果您能就该主题推荐任何好的引用资料,我将不胜感激。

R7RS 草案在 4.2.8 节中关于准报价的部分有这个例子。

`(( foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))

(它也在 R4RS 规范中,所以这不是新事物。)

根据规范,这应该评估为:

((foo 7) . cons)

我无法理解其中的原因。在我看来,.从内部列表的开头删除反引号,这意味着它不会被评估为过程。

这里有一个更简单的表达式来说明同样的问题:

`(foo . ,(car '(bar)))

使用与上面相同的逻辑,这应该评估为:

(foo . bar)

事实上,它确实在我尝试过的 Scheme 系统上进行了评估。

但是,根据我的理解,它不应该对此进行评估,所以我想找出我哪里出错了。

我对 Scheme 评估的理解是(好吧,简化了)如果它是左括号后的第一个关键字,则调用该过程并将列表的其余部分作为参数。

我对规范的理解是,',' 完全等同于将下一个表达式包装在 '(unquote' 过程中。

我对点符号的理解是,为了一般显示目的,您可以删除点和左括号(以及匹配的右括号),如下所述:

In general, the rule for printing a pair is as follows: use the dot notation always, but if the dot is immediately followed by an open parenthesis, then remove the dot, the open parenthesis, and the matching close parenthesis.

所以:

`(foo . ,(car '(bar)))

同样可以呈现为:

(quasiquote (foo unquote (car (quote (bar)))))

(事实上,这就是 jsScheme 将在其日志窗口中呈现输入的方式。)

但是,在评估时:

(quasiquote (foo unquote (car (quote (bar)))))

为什么要对“unquote”求值(作为一个过程?),取消引用并求值 (car...) 列表?当然,它应该只被视为引号,因为它不在左括号之后?

我可以想到一些可能的答案 - “unquote”不是常规过程,“unquote”是在常规评估过程之外进行评估的,有一种不同的方式来指示要调用的过程,而不是'(' 后跟过程的符号 - 但我不确定哪个是正确的,或者如何挖掘更多信息。

我见过的大多数方案实现都是使用宏来处理这个问题,而不是使用与求值器相同的语言,而且我很难弄清楚应该发生什么。有人可以解释一下或向我展示有关该主题的任何好的引用资料吗?

最佳答案

你是正确的,因为涉及宏:特别是,quasiquote 是一个宏,unquoteunquote-splicing 是文字.这些都不是程序,因此不适用正常的评估规则。

因此,可以给予 (quasiquote (foo bar baz unquote x)) 它需要的特殊处理,尽管 unquote 不是第一个语法元素。

关于scheme - 取消引用准引用点对中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810236/

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