begin 式
begin式は2つの用途があります.その1つはスプライシング(継ぎ足し)することと,もう1つは複数の式をまとめて1つの式(以下,複合的な式)にすることです. ここで,スプライシングとは, トップレベルやlambda式の本体などに定義や式を継ぎ足すことを言います. それぞれの用途に応じて,理論上,形式が異なります. 実のところ,1番目の形式(スプライシング)は2番目の形式(複合的な式)を形式的に含んでいるので,ちょっとしっくりこないのですが,意味の違いに応じて異なる形式と考えます.スプライシング
スプライシング(継ぎ足し)するときには次の形式を使用します.
(begin defn-or-expr*) syntax
この形式(定義を含む begin 式)は,トップレベル(あらゆる式の外側)か,
構文規則における body (lambda 式や let 式などの本体)の中に記述することができます.一方,それら以外のところに記述していて,かつ,定義を含んでいる場合にはエラーが発生します.定義を含んでいない場合,後述する複合的な式と解釈されてエラーは発生しません.
この形式の begin 式は,begin 式を囲む丸括弧やbeginキーワードはないものとして処理されます.より正確に言うと,以下の $\alpha_i$や$\beta_i$が定義や式を表すことにすると,
defn-or-expr ::= definition | expression definition ::= 定義(define形式など) expression ::= 式
$\alpha_1$
...
$\alpha_k$
(begin $\beta_1$ ... $\beta_m$)
$\alpha_{k+1}$
...
$\alpha_n$
といったトップレベルまたは body は
...
$\alpha_k$
(begin $\beta_1$ ... $\beta_m$)
$\alpha_{k+1}$
...
$\alpha_n$
$\alpha_1$
...
$\alpha_k$
$\beta_1$
...
$\beta_m$
$\alpha_{k+1}$
...
$\alpha_n$
といったトップレベルまたは body と等価です.
この等価性は,
...
$\alpha_k$
$\beta_1$
...
$\beta_m$
$\alpha_{k+1}$
...
$\alpha_n$
- begin 式の中で行われた定義がトップレベルまたは body の全体にわたって有効であること,
- $\beta_1$〜$\beta_n$がトップレベルまたは body の一部として先頭から順に評価されること
複合的な式
複合的な式(複数の式からなる1つの式)を構成するときには次の形式を使用します.
(begin expression+) syntax
この形式の begin 式は通常の式として使用できます.つまり,式が記述できるところ(構文規則において expression となっているところ)ならばどこでも記述できます.これは,if 式の帰結式や代替式などの,式が1つしか書けないところに複数の式を記述するために使用します.この形式のbegin 式は,その中の式が先頭から順に評価されていって,最後の式の結果を返します.