Guile基礎/スプライシングと複合式(begin 式)

変更履歴

概 要

目 次

参考資料

begin 式

begin式は2つの用途があります.その1つはスプライシング(継ぎ足し)することと,もう1つは複数の式をまとめて1つの式(以下,複合的な式)にすることです. ここで,スプライシングとは, トップレベルやlambda式の本体などに定義や式を継ぎ足すことを言います. それぞれの用途に応じて,理論上,形式が異なります. 実のところ,1番目の形式(スプライシング)は2番目の形式(複合的な式)を形式的に含んでいるので,ちょっとしっくりこないのですが,意味の違いに応じて異なる形式と考えます.

スプライシング

スプライシング(継ぎ足し)するときには次の形式を使用します.
(begin defn-or-expr*) syntax
   defn-or-expr  ::=  definition  |  expression
   definition    ::=  定義(define形式など)
   expression    ::=  式

この形式(定義を含む begin 式)は,トップレベル(あらゆる式の外側)か, 構文規則における body (lambda 式や let 式などの本体)の中に記述することができます.一方,それら以外のところに記述していて,かつ,定義を含んでいる場合にはエラーが発生します.定義を含んでいない場合,後述する複合的な式と解釈されてエラーは発生しません.

この形式の begin 式は,begin 式を囲む丸括弧やbeginキーワードはないものとして処理されます.より正確に言うと,以下の $\alpha_i$や$\beta_i$が定義や式を表すことにすると,
$\alpha_1$
...
$\alpha_k$
(begin $\beta_1$ ... $\beta_m$)
$\alpha_{k+1}$
...
$\alpha_n$
といったトップレベルまたは body
$\alpha_1$
...
$\alpha_k$
$\beta_1$
...
$\beta_m$
$\alpha_{k+1}$
...
$\alpha_n$
といったトップレベルまたは body と等価です. この等価性は, を示しています.

begin 式の中身をトップレベルや body に継ぎ足す処理のことをスプライシングと呼んでいます.トップレベルまたは body では begin キーワードがなくなるまでスプライシングを行います.例えば,上記の $\beta_i$のいずれかが begin 式だった場合,それもスプライシングされます. スプライシングを行う形式は,マクロを定義する際によく利用されるようです.

複合的な式

複合的な式(複数の式からなる1つの式)を構成するときには次の形式を使用します.
(begin expression+) syntax

この形式の begin 式は通常の式として使用できます.つまり,式が記述できるところ(構文規則において expression となっているところ)ならばどこでも記述できます.これは,if 式の帰結式や代替式などの,式が1つしか書けないところに複数の式を記述するために使用します.この形式のbegin 式は,その中の式が先頭から順に評価されていって,最後の式の結果を返します.
(おしまい)