我已经在Racket和Chez Scheme中测试过,发现(begin)
是可以接受的,而(define a (begin))
则不然。比如用Racket我得到了
> (begin)
> (define a (begin))
; stdin:56:10: begin: empty form not allowed
我的问题是为什么允许(begin)
?对此有什么具体的理由/直觉吗?
答案 0 :(得分:3)
表格开头有两个目的。
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)
。
答案 1 :(得分:0)
我发布here关于(begin ())
的答案是在(if () )
语句中使用begin的另一个可接受的理由。