【发布时间】:2016-12-28 09:50:53
【问题描述】:
我在 Racket and Chez Scheme 中进行了测试,发现(begin) 是可以接受的,而(define a (begin)) 不是。例如我得到的球拍
> (begin)
> (define a (begin))
; stdin:56:10: begin: empty form not allowed
我的问题是为什么(begin) 完全被允许?这有什么具体的原因/直觉吗?
【问题讨论】:
我在 Racket and 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)(禁用调试)。
【讨论】:
我在here 上发布的关于(begin ()) 的答案是在(if () ) 语句中使用开始的另一个可接受的理由。
【讨论】: