基本概念 - 構文

概要

この章では、Curl® 言語の構文を紹介します。以下の項目を含む様々なトピックにわたります。

基本的な構文

この章では、Curl 言語の以下の項目を含む幾つかの基本要素の概観を示します。

テキスト

要約:
  • Curl® 実行環境 は、Curl 言語ソース ファイルのトップレベルにあるテキストを表示します。
  • 複数の空白文字は 1 つとみなされます。
  • テキストを含まない行に続くテキストは、新しい段落に表示されます。
Curl® 言語で書かれたアプレットで、最もシンプルな要素はテキストです。Curl アプレットにテキストを含めると、ブラウザはそのテキストを表示します。Curl 言語のテキスト書式を使用せずにテキストを含めると、既定のフォントおよびポイント サイズでテキストが表示されます。空白は HTML と同じ方法で処理され、単語間の複数の空白文字は 1 つになります。つまり、単語間の連続する複数の空白文字は 1 つに折りたたまれ、ブラウザでは 1 つの空白のみが表示されることになります。この空白を折りたたむという規則は、タブ文字や改行文字にも適用されます。ただし、 Curl アプレット内のテキストを含まない行については空白文字はそのままになり、改行されて後続のテキストが表示されます。つまり、多くのテキストが続く場合はこれが段落区切りになります。
空白を折りたたむという規則とは、Curl 言語のテキスト書式を使用しなければ Curl アプレット内で適用したインデントや間隔はブラウザに反映されないということを意味します。次の例では、Curl アプレットのテキストがどのように処理されるかを示しています。ウィンドウのサイズを変更して、単語が次の行に折り返されるのを確認してください。

例: アプレットで書式設定されていないテキストの表示
Four score and seven years ago,
our fathers brought forth on this continent
a new nation,
conceived in liberty
and dedicated to the proposition
that all men are created equal.

Now we are engaged in a great civil war,
testing whether that nation,
or any nation so conceived and so dedicated,
can long endure.

予約文字

要約:
  • Curl 言語の予約文字は、{、}、\ および | です。
  • 予約文字をリテラル文字として使用するには、その直前にエスケープ文字 (\) を置きます。
  • 他のエスケープ シーケンスには、改行文字の \n、キャリッジ リターンの \r、タブの \t、および改行しない空白文字の \ があります。
  • \uXXXX または \UXXXXXXX を使用して、Unicode の 文字を指定することができます。
Curl 言語には、特別な意味を持つ文字があります。たとえば、Curl 言語では評価する式を Curl ブラケット ({}) で囲みます。このような文字は予約文字と呼ばれます。テキストに予約文字を入力した場合、誤って解釈され予期せぬ結果が生じる可能性があります。次の表に Curl 言語の予約文字を示します。
予約文字説明
{左 curl ブラケット (Unicode007B)
}右 curl ブラケット (Unicode007D)
\バックスラッシュ (Unicode005C)
|垂直バー (Unicode007C)
予約文字をリテラル文字として使用するには、予約文字の直前にエスケープ文字を置きます。バックスラッシュ文字 (\、または逆の斜線) はエスケープ文字です。したがって、文字のシーケンス、\{、\}、\| および \\ は、それぞれ左 curl ブラケット、右 curl ブラケット、垂直バー、バックスラッシュをテキストに挿入するために使用します。次に例を示します。

例: 予約文字をテキストに使用
To include the \{, \}, \|, and \\ characters in text, use
the \\ character to "escape" them from their special
interpretation.
                                                                                                                                                                                                                                                                                                        
エスケープ文字と予約文字の間に空白が入らないように注意してください。空白が含まれると、 エスケープ文字を空白の後ろの予約文字に関連付ける代わりに、エスケープ文字とその後の空白を 特殊文字の組み合わせとして解釈します。 (エスケープされた空白文字は、表示時に他の空白文字と一緒にまとめられない "ハードな" 空白 として解釈されます。改行されないように 2 つの単語間にこれを配置することもできます。)
エスケープ文字 (\) を使用して、キーボードに表示されない文字を示すこともできます。 次の表に、役に立ついくつかのエスケープ シーケンスを示します。(エスケープ シーケンスの完全なリストは、 「リテラル文字」のセクションを参照してください。)
エスケープ シーケンス説明
\n改行文字
\rキャリッジ リターン文字
\tタブ文字
\ (空白文字)改行されない空白文字
\{左 curl ブラケット文字
\}右 curl ブラケット文字
\\バックスラッシュ文字
\|垂直バー文字
\uXXXXUnicode の 16 進数で XXXX と表される任意の文字。 0xFFFF 以降の Unicode はこのシーケンスを使用して表示することはできません。
\UXXXXXXUnicode の XXXXXX と表される任意の文字。
Unicode のエスケープ シーケンスを使用して、エンドユーザーのコンピュータにインストールされているフォントに含まれる任意の文字または記号を表示できます。次に例を示します。

例: Unicode エスケープ シーケンスの使用
'\u0041' should be the same as 'A'.
さまざまなクラスの特殊文字や記号の Unicode 値の詳細については、Unicode Consortium Web サイト の 「Code Charts」(英語)を参照してください。

コメント

要約:
Curl 言語では 4 種類のコメントを提供しています。
  • 行末のコメント: || と行の最後の間にあるテキストは、すべて単一行のコメントとして扱われます。
  • 複数行のコメント: |##| 間のテキストは、すべてコメントとして扱われます。
  • タグ付きコメント: |tag-name##tag-name| 間のテキストは、すべてコメントとして扱われます。
  • 長さ指定のコメント: tag-name の代わりに、コメント内の文字数を使用して連続する任意の文字を囲むことができます。
コメントとは、Curl® 実行環境 (RTE) が解釈も表示もしないテキストのことです。コメントのテキストは、Curl 言語ソース ファイルでのみ表示されます。コメントは、ファイルを扱う人が関連する情報を挿入する場合に役に立ちます。Curl 言語には、コメントであることを示すさまざまな方法があります。

行末コメント

一番簡単なコメントのフォームは、2 つの連続する垂直バー (||) で開始して改行文字を含めずにその行の最後で終了します。この種類のコメントを使用して、コード行またはコード行の最後に情報を加えることができます。この行末コメント (後続コメントとも呼ばれます) の構文を次に示します。
|| comment-text
ここで、comment-text はコメントのテキストです。次に例を示します。

例: 行末コメントの使用
A comment can be on a line by itself,
|| A comment on a line by itself
or it can be at the end || A comment on the same line as code
of a line.
行の終わりを示す文字はコメントの一部ではありません。テキストにコメントを追加する場合はこの点に留意してください。マークアップのないテキストでは、空白行を使って新しいテキスト段落を作成することができます。空白行または前の行にコメントが含まれる場合は、その行の終わりを示す文字はコメントの一部ではなく、新しい段落に必要な空白行と見なされます。これは上の例でも示されています。

複数行のコメント

もう 1 つのコメントのフォームは、垂直バーとシャープ記号 (|#) で始まり、シャープ記号と垂直バー (#|)で終わりを示します。このコメントのフォームは複数行のコメントと呼ばれ、1 つのコメント内に複数行の情報を簡単に追加することができます。ただし、この種類のコメントを使用してコード行の中央にコメントを追加することもできます。これらのコメントの構文を次に示します。
|# comment-text #|
ここで、comment-text はコメントのテキストです。次に例を示します。

例: 複数行のコメントの使用
A comment can be |# Here is a comment #| placed within a line of code,
|#
   A comment
   that
   spans
   multiple lines
#|
or it can span multiple lines.
このフォームのコメントでは、|# と #| の間の文字のみがコメントになる点に注意してください。行の終わりを示す文字はコメントには含まれません。たとえば、上の例ではコードの 1 行目と 7 行目に改行文字があります。したがって 1 行目と 8 行目の行の間の表示領域に段落区切りがあることになります。
複数行のコメントの一般的な使用法には、既存のコードの一部をコメント文字で囲むコメント アウトがあります。コメント アウトは開発者がよく使います。コードをコメント アウトすることで一時的にファイルからコードを削除することができます。これはコードをデバッグする際に特に役に立ちます。たとえば次の関数呼び出しでは、引数の 1 つをコメント アウトしています。
{foo |#arg1=val1,#| arg2=val2}
次のコードでは || のコメントを含むプロシージャ宣言全体がコメント アウトされています。
|#
    || A procedure that indicates if two arguments are equal.
    {define-proc public foo {arg1:any=val1, arg2:any=val2}:bool
        {return arg1 == arg2}
    }
#|

タグ付きコメント

3 番目のコメントのフォームの構文を次に示します。
構文:|tag-name# comment-text #tag-name|
説明:
tag-name有効な Curl 言語の識別子です。
comment-textコメントのテキストです。
|tag-name# comment-text #tag-name|
有効な識別子の長さは任意で、文字または下線で始める必要があります。文字、数字、ハイフン (-)、下線 (_) および疑問符 (?) のみ含むことができます。(Curl 言語の識別子および命名規則の詳細は、「識別子」を参照してください。)
このフォームのコメントは、短いコメントを含むソース コード部分をコメント アウトする場合に使用できます。一意の新しいタグを使用することにより、異なるコメント終了フォームが先に検出されてコメントが突然終了してしまうという危険性を回避することができます。
次に例を示します。

例: タグ付きコメントの使用
This text surrounds a tagged comment
|test#
    Here is an end-of-line comment: || END-OF-LINE COMMENT

    Here is a comment that |# MULTILINE
    COMMENT #| spans multiple lines.

    And here |other-tag# ANOTHER TAGGED COMMENT #other-tag| is
    a tagged comment with a different tag.
#test|
that itself contains assorted comments.

長さ指定のコメント

コメントが自動的に生成され任意の文字が含まれる場合は、選択されたタグですべてのコメントを終了できるという保証はありません。長さ指定のコメントを使用すれば、自動的に生成されたコメントをスキャンしてコメントの終了文字シーケンスを検索するためのコードを書く必要がなくなります。
次の例に示すように、長さ指定のコメントでは開始および終了コメント記号はコメント内の文字数を指定します。
構文:|num-chars# comment-text #num-chars|
説明:
num-charsコメント内の文字数で、コメントの開始および終了文字列はこれに含まれません。
comment-textコメントのテキストです。
次に例を示します。

例: 長さ指定のコメントの使用
Here is some text |20# please#|&#@|ignore #20| surrounding a
length-specified comment.
実行時にコメントの内容がコンピュータで生成される場合、コンピュータで文字数を計算することもできます。

要約:
  • 式とは本質的に Curl 言語のコマンドです。
  • たいていの式は { と } で囲まれます。
  • 式が検出されるとそれが評価されます。
  • RTE は、式の中の部分式をすべて左から右へ順番に評価していきます。
  • ほとんどの式は値を生成します。
  • トップレベルの式によって生成された値はブラウザに表示されます。
式とは本質的に Curl 言語のコマンドを指します。このガイドの大半は、ファイルに含めることができるさまざまなタイプの式に関する説明で占められています。Curl 言語のほとんどの式は、左 curl ブラケット ({) と右 curl ブラケット (}) 文字で囲まれています。
式を囲む curl ブラケットの数はコードのレベルを示すことになります。Curl 言語のソース ファイルで、他の式の中に含まれていない式はトップレベルの式と見なされます。たとえば、プロシージャ定義はトップレベルの式です。トップレベルの式の中にある式はトップレベルの式ではなく、1 レベル下がります。たとえば、プロシージャ内のローカル変数宣言はトップレベルのコードではありません。トップレベルの式が値を生成するとブラウザに表示されます。次のコードでいくつかの式を示します。
|| Text...
This is some text.

|| The variable definition (that is, the let expression)
|| is top-level code.  The VBox instantiation is not
|| top-level code because it is an expression within
|| the curly braces for the let expression.
{let my-box:VBox = {VBox "Hello "}}

|| The procedure definition is top-level code.
{define-proc {my-procedure}:void
    || However, the code in the procedure definition
    || is not top-level code.  It is one level deeper.
    {my-box.add "World"}
}

|| Text with some top-level code.  The value expression
|| is top-level code.
The first public release of the Curl language was in the year {value x}.
次の例には、コメント、テキストおよび Curl 言語式が含まれています。この例の式は sqrt プロシージャ呼び出しです。(多くのプログラミング言語のように、Curl 言語には sqrt プロシージャなどの便利な機能が多数用意されています。)sqrt プロシージャは、与えられた値を受け取りその値の平方根を返します。

例: 式の構文解釈
|| Calling a built-in math procedure
The square root of 4 is {sqrt 4}.
Curl ブラケット内の式では、左 curl ブラケットの直後にプロシージャの名前を書く必要があります。プロシージャ名に与える値がそれに続き、右 curl ブラケットで式の終わりを示します。上の例の式が検出されると、sqrt プロシージャを呼び出してプロシージャに指定した値が渡されます。RTE は、式の中の部分式をすべて左から右へ順番に評価します。次に、プロシージャが返す値が表示されます。通常、トップレベルの式が検出されるとそれが評価されて値が表示されます。
次の例では、テキストの書式を設定する Curl 言語式が使用されています。bold テキスト書式はテキストを太字にします。この式では左 curl ブラケットの直後にテキスト書式の名前が続きます。テキスト書式を適用するテキストはテキスト書式と右 curl ブラケットの間に挿入されます。この式が検出されると、コンパイラは指定された書式でテキストを表示します。

例: Curl 言語式を使用したテキストの書式設定
|| Text that includes a text format.
Here is some {bold bold} text.
チュートリアルを含むテキスト書式の各式の詳細については、「テキスト書式入門」を参照してください。

変数の使用

要約:
  • let 式を使用して、変数を作成し初期値を代入します。
  • set 式を使用して、新しい値を既存の変数に代入します。
  • letset 式は、値を生成しません。
ファイルで変数を作成する場合がよくあります。変数は、値をメモリに格納する 1 つの方法です。変数にはそれぞれ名前があり、これを使用して値にアクセスしたり、新しい値を代入します。変数を作成して初期値を与えるには let 式を使用します。
{let x = 13}  || x is a new variable with the value 13
set 式を使用して、変数の値を変更することもできます。
{set x = 200}  || now the value of x is 200
Curl 言語の変数の詳細については、「変数」の章を参照してください。

valuedo 式の使用

要約:
  • value は 1 つ以上の Curl 言語式を実行して、最後の式の値が生成された場合はそれを返します。
  • do 式は 1 つ以上の Curl 言語式を実行しますが値を生成しません。
  • value および do 式の内部の let または set 式は、curl ブラケットで囲む必要はありません。
テキスト内に変数値を表示する場合、単に変数の名前を使用することはできません。この理由は、RTE は変数名を追加のテキストとして処理し、値ではなく名前をそのまま表示してしまうからです。変数の値を取得するには value 式を使用します。

例: value を使用して変数を表示
|| Define a variable called current-floor and give it an
|| initial value of 13.
{let current-floor = 13}

|| If you do not use the {value ...} expression, the runtime
|| interprets the variable name as text.
current-floor

|| If you use a top-level {value ...} expression, the
|| value of the variable is displayed.
{value current-floor}
value 式に複数の Curl 言語式を含めることもできます。慣例により、部分式はそれぞれ新しい行から開始します。value 式は部分式を 1 つずつ順番に実行して、最後の部分式の値を生成します。次に例を示します。

例: 連続する式と value の使用
{value
    || Define a variable called current-floor and give it
    || an initial value of 13.
    let current-floor = 13

    || Add one to the value of current-floor.
    set current-floor = current-floor + 1

    || Note that this value is not displayed because it is
    || not the last expression in the value expression.
    current-floor

    || Add one more to the value of current-floor.
    set current-floor = current-floor + 1

    || Display the value of current-floor.
    current-floor
}
do 式は、順番に評価される 1 つ以上の Curl 言語式が連続して含まれているという点で value 式と似ています。このような連続する式は、コードのブロックまたは コード ブロックと呼ばれます。
value 式とは異なり、do 式は値を生成しません。したがって、一連の部分式を実行して最後の部分式が生成する値を表示しない場合にこの式を使用します。

例: do の使用
{do || try changing this to "value" instead

    || Define a variable called current-floor with
    || an initial value of 13.
    let current-floor = 13

    || Add one to the value of current-floor.
    set current-floor = current-floor + 1

    || Add one more to the value of current-floor.
    set current-floor = current-floor + 1

    || This expression produces the new value of current-floor,
    || but it will not be displayed unless you change the
    || outer expression to be a "value" expression.
    current-floor
}
|| Uncommenting the following line will cause an error, since
|| the variable current-floor is undefined outside of its block.
|| {value current-floor}
ただし、上の例のようにコード ブロックに変数を作成すると、そのブロックが継続する間だけメモリに格納されます。つまり、トップレベルのコードまたは他のコード ブロックでその値を表示することはできません。このルールも上の例で確認することができます。
前述の 2 つの例では、
let current-floor = 13
および
set current-floor = current-floor + 1
の行は curl ブラケットで囲まれていませんがエラーにはなりません。letset を使用する定義式および代入式は、特別な Curl 構文のルールに従います、これらは Curl ソース コードで頻繁に発生しますが値は生成しません。コード ブロック内の let または set ステートメントは、curl ブラケットで囲む必要はありません。ただし、トップレベルのテキストでは curl ブラケットが常に必要です。ブラケットがなければ、let および set 式は評価されずにテキストとして表示されます。
コードブ ロックの詳細については、「コード ブロック」を参照してください。

演算式

要約:
  • カッコを含む通常の算術演算子を Curl 言語のソース コードで使用することができます。
  • 演算式は常に値を生成します。
  • 演算式は curl ブラケットで囲まれません。
  • 演算式の値を値の表現に含めることにより、トップレベルのテキストに表示することができます。
加算、減算、乗算および除算などの Curl 言語の演算は、演算対象の値を表す 2 つの式の間に通常の演算記号の +-* および / を書くことによって示されます。カッコを使用して、次に示すように複雑な演算式のコンポーネントが評価される順序を制御することができます。
(3 + 4) * (8 - 5)
上の例では、それぞれの算術演算子の両側に空白があります。これが推奨されるスタイルです。記号 - を使用して 2 つの式を減算する場合、記号を空白で囲む必要があります。これは、同じ記号 '-' が他のコンテキストでは減算、否定または変数名内のハイフンを表わす可能性があるためです。
10 - 3  || subtraction operation whose value is 7
10 -3   || two numbers evaluated, last value is -3
10-3    || two numbers evaluated, last value is -3
10- 3   || causes a syntax error
a-b     || causes a syntax error if no variable "a-b" is defined
各演算式は値を生成しますが、算術式を Curl プレフィックス式のように curl ブラケットで囲まないでください。次に例を示します。
sum1 - sum2    || is a legal arithmetic expression
{sum1 - sum2}  || is not a legal arithmetic expression
ただし、トップレベルのソースコードにある演算式は、実行される演算ではなく表示されるテキストとして処理されます。トップレベルのテキスト内で演算式を評価して結果を表示する場合は、演算式を value 式で囲みます。次に例を示します。

例: トップレベルのテキスト内で演算式を評価
The value of 2 * 1024 is {value 2 * 1024}.
アプレットでトップレベルの value ブロックの最後の式として演算式を含めることもできます。次の例で示されるように、ブロックの最後の式の結果のみが表示されます。

例: コードブロック内で演算式を評価
{value
    || Define four variables, each with an initial value.
    let a = 5
    let b = 1
    let c = 4
    let d = 2

    || Compute and display the following value:
    (a * d) - (b * c)
}
Curl 言語の演算子の詳細については、「演算子」を参照してください。

逐語的文字列

要約:
  • 逐語的文字列を使用したテキストは実行環境で解釈されません。
  • トップレベルのコード内では、RTE は逐語的文字列の内容を解釈せずに表示します。
  • テキスト書式内では、逐語文字列の内容を解釈せずにテキスト書式を適用して表示します。
  • コード内では、逐語的文字列を文字列として処理します。
Curl 実行環境 は通常、Curl 言語ソース ファイルにおける curl ブラケット内にある式や特殊文字のシーケンスを、(それらが普通の、あるいは引用テキスト内に存在する場合でも)すべて解釈します。次に例を示します。

例: テキストおよび引用テキスト内で評価される Curl 式
Curly braces signal expressions to be {italic interpreted},
even within quotation marks:
"Act now! {bold deeds are called for}"

You can use escape characters (\\) to change how individual characters
are interpreted, but the escape sequences are still displayed differently
than they are written:
"Act now! \{bold deeds are called for\}"
実行環境で解釈されないテキストを Curl ソース ファイルに含める場合は、逐語的文字列(verbatim string)を使用します。
逐語的文字列に含まれるテキストは、RTE で解釈されません。つまり、逐語的文字列中の予約文字や式はチェックされません。プログラミング言語の中には、逐語的文字列を未加工テキストまたはスーパーリテラル文字列と呼ぶものがあります。特殊文字のシーケンスで逐語的文字列を囲む必要があります。逐語的文字列内では、これを終了するための特殊文字のシーケンスのみが実行環境によってチェックされます。Curl 言語には 3 種類の逐語的文字列があります。

標準の逐語的文字列

標準の逐語的文字列の構文を次に示します。
|" text "|
ここで、text は逐語的文字列のテキストです。次の例は、逐語的文字列内で予約文字が解釈されていないことを示します。

例: 解釈されない逐語的文字列内の予約文字
|"To include the {, }, |, and \ characters in text, use the \
character to "escape" them from their special interpretation."|
次の例は、逐語的文字列内の式 (ここではテキスト書式) が解釈されていないことを示します。

例: 解釈されない逐語的文字列内の予約文字
|"{tiny If you have the winning number, we'll say}

You have won {big color="red", one million dollars!}"|

タグ付きの逐語的文字列

逐語的文字列内に標準の逐語的文字列を示す文字のシーケンスを含める (つまり、逐語的文字列に |" または "| を含める) には、タグ付きの逐語的文字列を使用します。タグ付きの逐語的文字列の構文を次に示します。
|tag-name" text "tag-name|
tag-name は有効な Curl 言語の識別子です。text は逐語的文字列のテキストで、これに他の逐語的文字列を含めることもできます。(有効な Curl 言語の識別子の詳細については「識別子」のセクションを参照してください)。次に例を示します。

例: タグ付きの逐語的文字列の使用
|test"Check out the following verbatim string...
|"To include the {, }, |, and \ characters in text, use
the \ character to "escape" them from their special
interpretation."|"test|

長さ指定の逐語的文字列

逐語的文字列を自動的に生成するコードを記述する場合に、長さ指定の逐語的文字列を使用すると大変便利です。長さ指定の逐語的文字列では逐語的文字列の文字数を指定します。長さ指定の逐語的文字列を使用すれば、自動的に生成された逐語的文字列をスキャンして、予期しない終了逐語的文字のシーケンスを検出するためのコードを書く手間が省けます。長さ指定の逐語的文字列の構文を次に示します。
|num-chars" text "num-chars|
ここで、num-chars は逐語的文字列の文字数で、text は逐語的文字列のテキストです。num-chars には逐語的文字列の開始および終了文字のシーケンスは含まれません。次に例を示します。

例: 長さ指定の逐語的文字列の使用
|15"{ \ | ( ) | ? }"15|

逐語的文字列の使用

テキスト書式は、テキストの表示と書式設定を行なうための特別な種類の式です。テキスト書式内で逐語的文字列を使用すると、逐語的文字列の内容は解釈されずにそのまま表示用に書式設定されます。次に例を示します。

例: テキスト書式内で逐語的文字列を使用
{bold |" {italic  Here   is
 a    bold   {italic    verbatim}   string. } "|}
上の例では、逐語的文字列のテキストが表示されると、単語間または段落間の余分な空白が折りたたまれ、単語は通常のテキストのように次の行に折り返されることも示しています。 実行環境で解釈を中止する場合とは別に、テキスト内の空白や改行文字をそのまま保持する方法の詳細については、「pre の詳細」を参照してください。
コードで逐語的文字列を使用すると RTE はこれを文字列と同じように処理しますが、文字は解釈されません。

例: コード内で逐語的文字列を使用
|| Define a procedure that takes a string of characters
|| and returns the string.
{define-proc {display-string x:String}:String
    {return x}
}

|| Call the procedure for a verbatim string.
{display-string |"{italic verbatim}"|}