コードブロック
Curl式は、コマンドかコードブロックであると書きました。どちらも、{ } に囲まれています。{ } がコードブロックの範囲かと言うとそうとも限りません。コードを書いていると経験的にはわかってきますが、コードブロックについて具体的な事例で説明します。
トップレベルでコードブロックを記述するのに利用するvalueマクロのサンプルです。
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{value
|| コードブロック開始
let a:int = 10
{inc a}
a
|| コードブロック終了
}
valueは、トップレベルの式です。その中のインデントされている部分がコードブロックになります。その中で変数のスコープが有効になります。
if式の例です。
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{let a:int = 10}
{if a < 20 then
|| コードブロック開始
let b:int = a + 10
set a = b
|| コードブロック終了
else
|| コードブロック開始
let b:int = a - 10
set a = b
|| コードブロック終了
}
a = {value a}
if式全体が1つのコードブロックなのではなく、thenの後、elseの後で2つのコードブロックが形成されます。この2つに同じ名前の変数を定義してもエラーにならずに利用できます。switch文などでも同様なことが言えます。
プロシージャ定義の例です。
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{define-proc public {pythagoras a:double, b:double}:double
|| コードブロック開始
let c:double = {sqrt a * a + b * b}
{return c}
|| コードブロック終了
}
{pythagoras 5, 12}
プロシージャ定義は、define-procで始まっています。この中はコードブロックです。内部で定義した変数はローカル変数です。
トップレベルの実行順番
トップレベルで記述されたテキストや式は、上から順番に実行されます。プロシージャなどを定義する場合は、プロシージャを呼び出すコードよりも先にプロシージャが定義されている必要があります。
{curl 7.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{define-proc public {pre-proc a:int, b:int}:int
{return a + b}
}
{pre-proc 1, 2}
{post-proc 3, 4} || エラーになる
{define-proc public {post-proc a:int, b:int}:int
{return a + b}
}
実行するとこのような結果(図2)になります。
前もって定義したプロシージャは呼び出すことができますが、後ろで定義したプロシージャは見つからずにエラーとなります。クラスなどでは、メソッドの位置によって実行できないなどのようなことは発生しませんのでご安心ください。
最後に
トップレベルとコードブロックについて見てきました。Curlのプログラムを書く場合、独立型アプレットを使ったり、アプレットでもクラスやプロシージャの実装が中心になると思います。結果的に、トップレベルはあまり利用しないのですが、Curlの理解に少しでもお役に立てれば幸いです。



