【问题标题】:Why is (begin) valid in Scheme?为什么(开始)在 Scheme 中有效?
【发布时间】: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) 完全被允许?这有什么具体的原因/直觉吗?

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    表单开始有两个目的。

    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)(禁用调试)。

    【讨论】:

      【解决方案2】:

      我在here 上发布的关于(begin ()) 的答案是在(if () ) 语句中使用开始的另一个可接受的理由。

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 2015-07-31
        • 2011-10-17
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多