[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>
を返しますが、返り値に依存するコードは書くべきではありません。