我在 Racket 和 Chez Scheme 中进行了测试,发现 (begin)
可以接受,而 (define a (begin))
不是。例如我得到的 Racket
> (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)
当调试被禁用时。
关于scheme - 为什么(开始)在 Scheme 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359441/