Scheme中的begin有什么用?

What is the use of begin in Scheme?

我不明白在 Scheme 中编写表达式序列时使用 begin 关键字有何用处。

我的意思是,当我写表达式时,它们不是应该从左到右求值吗?那么,为什么我还必须包含 begin 关键字?

我读到 begin 应该消除输入和输出的副作用。谁能给我一个需要开始的情况?

begin 当语法只允许一种形式时,每次您需要多种形式时,都是必需的。例如,如果您需要在每次使用变量 y 时递增它:

(+ x 
   (begin (set! y (+ y 1)) y) 
   z)

如果你省略了开头,那么你就不能写这个表达式(在 Common Lisp 中,相同的表达式可以写成 (+ x (incf y) z))。

请注意 (set! x y) 不是 return 值。这就是我们需要使用 begin 的原因,因为 (begin f1 f2 ... fn) 依次计算 f1 ... fn,然后 return 是 fn 的值。因此,(begin (set! y (+ y 1)) y) 递增 y 的值并且计算 y,然后它的新值是 returned.

begin 通常在有一些副作用时使用。