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

标签 scheme racket

我在 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/

相关文章:

macros - 仅使用 LISP 原语定义 defmacro 函数?

scheme - (Scheme) 如何将 2 个不同大小的列表加在一起

scheme - 为什么我的对输出中出现 mcons 符号?

servlets - 使用 Racket servlet 提供静态文件

scheme - 关于一个小程序

functional-programming - 方案( Racket )正确编写的功能不适用于某些输入

Racket:你如何使用参数的值作为符号?

functional-programming - Scheme/Racket 过滤/映射多个参数

scheme - 来自 Racket 的产卵或系统

string - Racket 中列表到字符串的转换