我在 Racket 和 Chez Scheme 中进行了测试,发现(begin)
是可以接受的,同时(define a (begin))
不是。例如我得到的球拍
> (begin)
> (define a (begin))
; stdin:56:10: begin: empty form not allowed
我的问题是为什么(begin)
到底允许吗?这有什么具体的原因/直觉吗?
表单开始有两个目的。
1. To sequence the evaluation of expressions
2. To "splice" sequences together (used by macros)
第一个是最常用的:
(begin e0 e1 ...)
将按顺序评估表达式 e0 e1 ...。
当宏扩展为多个定义和/或表达式时,使用第二个。
举个例子,下面的
(begin
(begin d1 e1 d2 d3)
(begin)
e2
...)
将被宏扩展器展平为:
(begin d1 e1 d2 d3 e2 ...)
现在的问题是“为什么(开始)被允许?”。如果begin
用于目的 1(测序),然后是一个空的begin
可能会被禁止。对于目的2(拼接)使用起来非常方便(begin)
作为不执行任何操作的宏的结果。考虑一个宏(debug expression)
要么扩展到expression
(当启用调试时)或进入(begin)
当调试被禁用时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)