为什么(开始)在Scheme中有效?

时间:2016-12-28 09:50:54

标签: scheme racket

我已经在Racket和Chez Scheme中测试过,发现(begin)是可以接受的,而(define a (begin))则不然。比如用Racket我得到了

> (begin)
> (define a (begin))
; stdin:56:10: begin: empty form not allowed

我的问题是为什么允许(begin)?对此有什么具体的理由/直觉吗?

2 个答案:

答案 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的另一个可接受的理由。