For Development HEAD DRAFTSearch (procedure/syntax/module):

4.7 式をまとめる

Special Form: begin form …

[R7RS base] formを順に評価し、最後の値を返します。

Beginletのように新たなスコープを作成するわけではありません。 すなわち、一般的には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))
Macro: begin0 exp0 exp1 …

exp0, exp1, … を評価し、exp0の結果を返します。 この名前はMzSchemeから取られました。これはCommonLispで prog1と呼ばれているものです。

beginと違って、これは新たなスコープを構成します。 begin0フォームは次のように展開されるからです。

(receive tmp exp0
  exp1 ...
  (apply values tmp))
Macro: independently exp …

[SRFI-236] exp …を順序を問わずに評価し、未定義値を返します。 このフォームはSRFI-236で定義されました。

複数の式を評価するのにはbeginが使えますが、 beginは順序も指定してしまいます。 independentlyは、コードを読む人に順序が関係ないことを伝え、 またコンパイラにより多くの最適化の機会を与えます。

式がどういう順で評価されるかわからないので、SRFI-236では結果の値は指定されていません。 Gaucheは#<undef>を返しますが、返り値に依存するコードは書くべきではありません。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT