コード ブロック

この章では Curl® 言語のコード ブロックについて説明します。具体的には、以下の項目について説明します。

コード ブロック入門

要約:
  • コード ブロックには多数の異なるタイプがあります。
  • コード ブロックを使用して Curl のソース コードをグループ化することができます。
  • コード ブロックのタイプによって、戻り値の特徴が異なります。
  • コード ブロックにはスコープ機能があります。
コード ブロックはプログラミング言語の中心となる部分で、一般的なコードの多くの場所に置かれます。変数やオブジェクトのスコープなどについて解説する際にはコード ブロックの概念が重要になります。
コード ブロックとは、ステートメントや式のグループです。このガイドが進行するにつれて明らかになることですが、コードのグループ化には多くの理由があります。通常は、特定のコード ブロックのタイプのプロパティを利用するためにコードをグループ化します。Curl 言語には多くの異なるタイプのコード ブロックがあります。コード ブロックのタイプによってプロパティや構文が異なります。これらのコード ブロックのいくつかを次に示します。
コード ブロックから返される値の性質は、コード ブロックのタイプによって異なります。コード ブロックのタイプには、値を返さないもの、最後の式の値を返すもの、さらに複数の値を返すものがあります。たとえば、 do 式のコンストラクトの本体は値を返しませんが、関数の本体はゼロまたはそれ以上の値を返すことができます。
つまりコード ブロックは、ソース コードをグループ化してそのコードのブロックから適切な値を返す機能を備えています。コード ブロックにはもう 1 つの非常に大切な特徴があります。これは、各コード ブロックで変数に対して新しいスコープが作成されることです。コード ブロック内の変数の定義は、そのコード ブロックの外側からは利用できません。
トップレベルのコードで定義されるそれぞれの変数はグローバル変数と呼ばれます。グローバル変数はコード全体で利用できます。コード ブロック内で定義されるそれぞれの変数はローカル変数と呼ばれます。ローカル変数は、それが定義されているコード ブロック内だけで利用できます。

value

要約:
  • コード ブロックを作成します。
  • 評価されたコード ブロック内の最後の式の値を返します。
  • トップレベルのコードにコード ブロックが含まれ、その戻り値が必要な場合に使用します。
value 式はコード ブロックを作成します。コード ブロック内の各ステートメントや式を評価して、最後の式で生成された値があればそれを返します。value 式の構文を次に示します。
構文:{value
   curl-expressions
}
説明:
curl-expressionsコード ブロックです。コード ブロックには変数の宣言や Curl 言語式を含めることができます。
value コード ブロックは、特定のタイプの式をテキストに挿入する場合に便利です。テキストに Curl 言語式を含めると、Curl® 実行環境 はこの式を評価して戻り値を表示します。演算子式や変数参照などの Curl 言語式は Curl ブラケットで囲まれていません。Curl ブラケットで囲まれていないこのような Curl 言語式はテキストとして解釈されます。これらを Curl 言語で書かれたソース コードとして処理するには、 value 式を使用してその式の値が返されるようにします。この例は、このセクションの後半に掲載されています。
次の例では、value 式を使用してトップレベル コードに演算子式を挿入する方法を示しています。

例: value に 1 つの式を挿入
|| Multiplication operation
I am {value 8 * 12} months old.

|| String concatenation operation and character literals
My name is {value "Barbra " & 'J' & " Streisand"}.

|| Quantity arithmetic operation
I am {value 1m + 80cm} tall.

|| Logic arithmetic operation
Are these statements {value true or false} or {value not true}?
上の例は比較的簡単で、value コード ブロックに 1 つの式を含めているだけです。もちろん、value コード ブロックに複数の式を挿入することもできます。この場合、コード ブロック内の式は順番に評価されます。さらに、他のコード ブロックと同じように value コード ブロック内にローカル変数を宣言することができます。変数を宣言するには let ステートメントを使用します。次の例では、変数の宣言と複数の式が挿入された value コード ブロックを示しています。

例: value に式のブロックを挿入
{value
    || Declare an integer.
    let i:int

    || Assign a value to the integer.
    set i = 4

    || Increment the value of the integer.
    set i = i + 1

    || The value of i.
    i
}
value コード ブロックは、評価対象の最後の式の値のみ返す点に注意してください。上の例では、最後の式は変数 i の値になります。次の例では、value コード ブロックが最後の式の値のみ返すことを分かりやすく示しています。

例: value 式から値を返す
{value
    || Evaluate a string literal.
    "hello"

    || Evaluate a numeric literal.
    21
}

do

要約:
  • コード ブロックを作成します。
  • トップレベルのコードにコード ブロックが含まれ、その値を返す必要がない場合に使用します。
do 式はコード ブロックを作成します。コード ブロック内の各ステートメントや式を評価しますが、値を返しません。do 式の唯一の目的はコード ブロックを作成することです。do 式の構文を次に示します。
構文:{do
   curl-expressions
}
説明:
curl-expressionsコード ブロックです。コード ブロックには変数の宣言や Curl 言語式を含めることができます。
do コード ブロックは、テキストにステートメントや式を挿入し、その結果の値は生成せず表示もしない場合に使用します。

コード ブロック値の受け取り

要約:
  • let または set ステートメントを使用して変数に値を代入します。
  • 1 つまたは複数の値を代入できます。
コード ブロックの多くは値を生成します。 コード ブロックが別のブロックの内部ではなくアプレット ファイルのトップレベルにある場合、生成される値は上記に示されるようにすべてその周囲のトップレベルのテキストとともにアプレットに表示されます。コード ブロックがトップレベルにない場合、生成される値はほとんどの場合 let または set ステートメントで変数に代入されます。
let ステートメントで新しい変数を 1 つ定義し、それに値を代入して初期化する場合の構文は次のとおりです。
構文:[{]let name:datatype = expression[}]
説明:
name以前に定義された変数の名前です。
expression有効な Curl 言語式です。
set ステートメントは、既に定義されている変数に値を再度代入するために使います。この構文は値を代入する場合と似ています。
構文:[{]set name = expression[}]
説明:
name既に定義された変数名
expressionCurl 言語の式
次の例では let ステートメントを使って変数を初期化し、if コード ブロックが生成する結果を表示します。例題を再度実行すると異なる結果を得ることかできます。

例: let を使用して変数を初期化
|| The following assignment generates a random value between 0 and 1
{let random-number:float = {{Random}.next-float}}
||
|| The following lines evaluate an "if-else" code block that produces
|| a value.
A coin was tossed and came up
    {if random-number < 0.5 then
        "heads"
     else
        "tails"
    }.
トップレベルのコードでは、let または set ステートメントと、表示されるトップレベルのテキストを区別するために Curl ブラケットでステートメントを囲む必要がありますが、 コード ブロック内では、この 2 種類のステートメントに対する Curl ブラケットの使用はオプションです。次のコードでは、コード ブロック内で set ステートメントを使い、プロシージャの戻り値を変数に代入しています。

例: 1 つの戻り値を変数(set)に代入
|| Declare a procedure that returns one value (an int).
{define-proc {single-return-proc}:int
    {return 99}}

{value
    || Declare an int called a.
    let a:int

    || Assign the return value of a call to single-return-proc
    || to the variable a.
    set a = {single-return-proc}

    || Display the value of a.
    a
}
let または set ステーメントを使って複数の値を代入することも可能です。let ステートメントの構文は次のとおりです。
構文:[{]let (name-1[:type-1], name-2[:type-2], ..., name-n[:type-n]) = function-call[}]
説明:
name-1, name-2, ..., name-nare names of variables to be defined.
function-callis a function call that returns multiple values.
同様に、複数の値を代入する場合の set ステートメントの構文は次のとおりです。
構文:[{]set (name-1, name-2, ..., name-n) = function-call[}]
説明:
name-1, name-2, ..., name-n変数の名前です。
function-call複数の値を返す関数呼び出し機能です。
次のコードは、set ステートメントを使用して変数に 2 つの戻り値を代入する方法を示しています。

例: 複数の戻り値を変数に代入
|| Declare a procedure that returns two int values.
{define-proc {return-2-values}:(int, int)
    {return 29, 38}
}

{value
    || Declare two int variables.
    let x:int
    let y:int

    || Assign the return values from the procedure
    || called return-2-values to the x and y
    || variables.
    set (x, y) = {return-2-values}

    || Display the values of the variables containing
    || the return values.
    x & " " & y
}
set ステートメントの詳細は「代入ステートメント」のセクションを参照してください。