Scheme 你怎么能重写;“开始”;计划中?

Scheme 你怎么能重写;“开始”;计划中?,scheme,Scheme,正如本文所解释的,Scheme中的begin是一种库表单,可以使用更基本的表单(如lambda)重写 但是如何重写开始,特别是考虑到以下几点 x ===> error: undefined identifier: x (begin (define x 28) x) ===> 28 x ===> 28 你不能。问题是,begin有两个角色:一个是对一组副作用的表达式进行排序,另一个是用于“拼接”宏结果。您可以使用上述定义的begin,这是第二个特性的结果,您不能自己编写它 如果

正如本文所解释的,Scheme中的
begin
是一种库表单,可以使用更基本的表单(如
lambda
)重写

但是如何重写
开始
,特别是考虑到以下几点

x
===> error: undefined identifier: x
(begin (define x 28) x)
===> 28
x
===> 28

你不能。问题是,
begin
有两个角色:一个是对一组副作用的表达式进行排序,另一个是用于“拼接”宏结果。您可以使用上述定义的
begin
,这是第二个特性的结果,您不能自己编写它

如果您真的想了解整个过程,那么可以将
begin
定义为一个简单的宏,使其只执行排序方面的操作(实际上可以这样实现,尽管通常不是这样)。但是,您需要在拼接定义(顶级或内部)中添加对
begin
s的明确识别。这意味着宏实现很好,但它不可能真正成为库,因为核心扩展器应该知道它。(而且由于语言是词汇范围的,因此核心扩展器无法识别核心语言中未定义的
begin
s。)

总而言之,您可以说R5RS将
begin
分类为“库语法”是错误的,因为它不能在库中定义。。。但即使这样也不完全准确,因为R5RS将“库语法”定义为“派生表达式”。因此,真正错误的一点是,
begin
s两个面中的一个面在扩展器中的其他地方实现(用于定义上下文)


还需要注意的是,R6RS澄清了整个问题:begin的两个方面都是明确的,它现在是核心语言的一部分,而不是“库形式”,甚至不是派生形式。

您仍然可以尝试编写一个begin版本,以满足其第一个角色:排序

(define-syntax sequencing
  (syntax-rules ()
    [(_ expression) expression]
    [(_ expression expressions ...)
     ((lambda (ignored) (sequencing expressions ...)) expression)]))

这是我从中获取该片段的帖子。它提供了更好的上下文,如果您是,您可能是。

那么为什么它被认为是“库语法”,而不是R5RS中的简单“语法”?我以为你可以只用基本表单重写图书馆表单?这是个错误(和维基百科的文章一起)。不,不需要引用——反例就足够了。eljenso的例子就是这样一个反例。等一下,R5RS的第7.3节将
begin
定义为一个宏,重写为
(lambda()exp…
-。。。反例是否暗示规范不正确?是的,这是奇怪的代码。与运行时类型错误无关——我认为<代码>(列表(定义x 1)x)< /代码>也同样奇怪。另外,
(列表x(定义x1))
是否有效?那么
(let([x1])(list x(define x2)x))
或者
(let()(list(define x1))
呢?(看起来鸡的repl被最后一个绊倒了。)无论如何,这不是进行实际讨论的好媒介。。。