As the 维基百科 http://en.wikipedia.org/wiki/Scheme_(programming_language)#Standard_forms文章解释说,begin
在Scheme中是一种库形式,可以使用更基本的形式重写,例如lambda
.
但是你如何重写一个begin
,特别是考虑以下因素?
x
===> error: undefined identifier: x
(begin (define x 28) x)
===> 28
x
===> 28
你不能。事情是这样的begin
有两个作用:一是对一堆有副作用的表达式进行排序,二是用来“拼接”宏结果。事实上你可以使用begin
上面的定义是第二个功能的结果,您不能自己编写它。
如果你真的想了解整个故事,那么你could define begin
作为简单的宏,它使它只执行排序方面的操作(它确实可以这样实现,尽管通常不是)。But,您需要添加显式识别begin
s 拼接定义(顶层或内部)。这意味着宏实现很好,但它不能真正成为一个库,因为核心扩展器应该知道它。 (并且因为该语言是词法范围的,所以核心扩展器没有好方法来识别begin
核心语言中未定义的。)
总而言之,你可以说 R5RS 只是分类错误begin
为“库语法”,因为它不能在库中定义......但即使这样也不完全准确,因为 R5RS 将“库语法”定义为“派生表达式”。因此,真正的错误点在于以下事实之一:begin
两个面在其他地方实现,在扩展器中(用于定义上下文)。
另请注意,R6RS 澄清了整个交易:两个方面begin
变得明确,现在它是核心语言的一部分,而不是“库形式”,甚至不是派生形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)