正如维基百科文章所解释的那样,begin在Scheme中是一个可以使用更基本的形式重写的库形式lambda.
但是你如何改写a begin,特别是考虑以下情况?
x
===> error: undefined identifier: x
(begin (define x 28) x)
===> 28
x
===> 28
Run Code Online (Sandbox Code Playgroud)
Eli*_*lay 18
你不能.事情是它begin有两个角色:一个是序列一组副作用表达式,另一个是它用于"拼接"宏结果.您可以使用begin上面定义的事实是第二个功能的结果,您无法自己编写.
如果你真的想要关注整个故事,那么你可以定义begin为简单的宏,这使得它只做序列方面(它确实可以这样实现,尽管通常不是这样). 但是,您需要将begins的显式识别添加到拼接定义(顶层或内部).这意味着宏实现很好,但它实际上不是一个库,因为核心扩展器应该知道它.(并且因为语言是词法范围的,所以核心扩展器没有好的方法来识别begin核心语言中没有定义的s.)
总结所有这些,你可以说R5RS在分类begin为"库语法"时是错误的,因为它不能在库中定义......但即使这样也不完全准确,因为R5RS将"库语法"定义为"派生表达".因此,真正错误的一点是,begin在扩展器(用于定义上下文)中,s两个面中的一个面在其他地方实现.
另请注意,R6RS澄清了整个交易:两个面begin都是明确的,它现在是核心语言的一部分,而不是"库形式",甚至不是派生形式.