[R7RS base] formを順に評価し、最後の値を返します。
Beginはletのように新たなスコープを作成するわけではありません。
すなわち、一般的にはform …の先頭に「内部のdefine (internal define)」を
置くことはできません。意味的には、beginはまるでform …が
beginを囲むコンテクスト中に展開されているかのように振舞います。
例えば、トップレベルに次のような式があった場合、それは2つのトップレベルのdefineと
同等です。
(begin (define x 1) (define y 2))
よりトリッキーな例:
(let ()
(begin
(define x 2)
(begin
(define y 3)
))
(+ x y))
≡
(let ()
(define x 2)
(define y 3)
(+ x y))
exp0, exp1, … を評価し、exp0の結果を返します。
この名前はMzSchemeから取られました。これはCommonLispで
prog1と呼ばれているものです。
beginと違って、これは新たなスコープを構成します。
begin0フォームは次のように展開されるからです。
(receive tmp exp0 exp1 ... (apply values tmp))
[SRFI-236] exp …を順序を問わずに評価し、未定義値を返します。 このフォームはSRFI-236で定義されました。
複数の式を評価するのにはbeginが使えますが、
beginは順序も指定してしまいます。
independentlyは、コードを読む人に順序が関係ないことを伝え、
またコンパイラにより多くの最適化の機会を与えます。
式がどういう順で評価されるかわからないので、SRFI-236では結果の値は指定されていません。
Gaucheは#<undef>を返しますが、返り値に依存するコードは書くべきではありません。