アプリケーションの記述

概要

特別な Curl® 言語のマークアップをソース コードに追加して、自分のアプリケーションの API リファレンス情報を作成することができます。このマークアップは総称で docstrings と呼ばれています。リファレンスの生成プロセスでは、このマークアップを使って API リファレンス情報を識別およびフォーマットします。このプロセスでコードから抽出された情報がアプリケーションの API リファレンス マニュアルになります。この API を使用する開発者は誰でも、ドキュメンテーション ビューアでこのドキュメントを参照することができます。
Curl のディプロイメント プロセスでは、ディプロイメント時にパッケージのドキュメントを生成できます。「パッケージ」を参照してください。ディプロイメントで生成されたドキュメントをインストールするには、[ヘルプ] メニューの [ドキュメンテーションのインストール] コマンドを使います。 ヘルプメニューを参照してください。

一般的なガイドライン

docstrings を記述する際には以下のガイドラインに従います。
docrefctext の説明は、「テキストのフォーマット」を参照してください。

Docstring のフォーマット

{doc-next ...} または {doc ...} を使って docstrings を作成します。このマクロ内に、記述するアイテムに適切な句を含めます。「docstring 句の概要」には、さまざまな docstring 句の説明が掲載されています。docstring 句の外側にある docstring にはテキストを含めないでください。ただし、{doc type = ...} docstring のシグネチャは例外で、これについては以下で説明します。
注意 : docstring 内にコメントを含めないようにしてください。ユーザーがドキュメント ファイルをエディタで開いて docstring 内のコメントを参照することがあります。軽率なコメント (たとえば、「この実装はひどい。」など) は自社および製品の品位を落とす恐れがあります。
以下のセクションでは、docstring の作成に使うマクロについて説明します。

{doc-next ...}

{doc-next ...} マクロを使って、定義が直後に続く docstring を指定します。このマクロの構文は次のとおりです。
{doc-next
docstring-clauses
}
ここで、docstring-clauses は記述するアイテムの docstring 句です。

{doc ...}

{doc ...} マクロは記述するアイテムの名前を指定します。主にプリミティブの記述に使います。理論上はこのマクロをコード内のどこにでも挿入できますが、なるべく記述するアイテムの直前に置くようにしてください。
このマクロの構文は次のとおりです。
{doc name
docstring-clauses
}
ここで name は記述するアイテムの名前、docstring-clauses はそのアイテムの docstring 句です。name を (" ") で囲む場合は、これに空白文字を含めることができます。

{doc type = ...}

マクロで生成されるコードの docstring を指定するには、{doc type = object-type ...} マクロを使います。これは type をキーワード引数として取り、その次には記述するアイテムのシグネチャを取ります。docstring 句が残余引数になります。たとえば、{doc type = method, ...} の構文は次のようになります。
{doc type = method,
signature
docstring clauses
}
次のコード例は、この構文を使って StringInterface のメソッドである equal? がどのように記述されるかを示しています。
{doc type = method, 
    public {StringInterface.equal?
               str:StringInterface,
               ignore-case?:bool=false
           }:bool
    {purpose
        Checks whether {ctext self} is equal to a specified
        {docref StringInterface}. 
    }
    {parameter str,
        The {docref StringInterface} with which you want to check
        for equality. 
    }
    {parameter ignore-case?,
        A keyword argument that indicates whether the test is to  
        ignore the case of the characters.  By default, the 
        test does not ignore case ({ctext ignore-case?=false}).  
        In other words, by default the test is case sensitive.  
        For example, {ctext "abcdefg"} is not equal to 
        {ctext "ABCDEFG"}.
    
        {param ignore-case?} is a keyword argument.  To specify  
        {param ignore-case?}, make sure to assign the desired  
        value to the keyword in the method call (for example 
        {ctext ignore-case?=true}).

        If you specify {ctext ignore-case?} and assign it 
        to {ctext true}, the test is not case-sensitive. 
        In this situation, {ctext "abcdefg"} is equal to 
        {ctext "ABCDEFG"}.
    }
    {return-vals
        A {ctext bool} value.  Returns {ctext true} if each 
        character in {ctext self} is equal to the corresponding 
        character in {param str}.  Otherwise, returns 
        {ctext false}.
    }
    {for-example
        . . . 
    }
}
{doc type = ...} docstring を使って記述できる Curl オブジェクトの種類には以下が含まれます。

パッケージの記述

ユーザーが API ドキュメンテーションの目次からパッケージ名をクリックすると、そのパッケージの docstring が表示されます。パッケージの docstring を指定するには、{doc type = package, ...} マクロを使います。通常これは、load.scurl と呼ばれるパッケージのメイン ファイルに置かれます。例として、gfx/3d/Scene/load.scurl にある CURL.GRAPHICS.SCENE パッケージの docstring の冒頭部分を次に示します。
{doc
    type = package,
    CURL.GRAPHICS.SCENE
    {purpose
        This package provides an interface for 3D
        retained-mode graphics. 
    }
    {details
        . . . 
    }
}
パッケージ内の個々の docstring はそのパッケージのみを参照できます。

テキストのフォーマット

特別なテキスト フォーマットにより、docstring のコンポーネントを簡単に識別できます。
Meta-variable (メタ変数) には metavar テキスト フォーマットを使います。Meta-variables とは、プログラマーが式または他の構文単位に置き換える必要のあるコードで、このテキストは斜体の serif フォントでフォーマットされます。また、次のような変数にも metavar を使います。
たとえば次のように記述すると、
{ctext {{metavar string1}:StringInterface.remove-clone
           {metavar index}:int,
           length:int=1,
           error-if-missing?:bool=true
       }:String
}
次のように表示されます。
{string1:StringInterface.remove-clone index:int, length:int=1, error-if-missing?:bool=true}:String
記述中の docstring 内の (位置) パラメータには param テキスト フォーマットを使います。このテキストは斜体の san-serif フォントでフォーマットされます。
キーワード引数の名前は不変なので、この引数には ctext テキスト フォーマットを使います。このテキストはモノスペース フォントでフォーマットされます。
ドキュメントに表示されているとおりにプログラマーが入力しなければならないコードを指定するには、ctext を使います。これには次が含まれます。
infinitynan および self にはすべて独自の docstring があり、したがって docref を使うこともできる点に注意してください。
オブジェクトに関連する docstring が、現在記述しているアイテムの外部にある場合は、docref を使ってこのアイテムの docstring へのリンクを作成します。docref タグにはもう 1 つのフォームがあり、docref-abbr を使うと、テキストにクラス名を表示せずにそのクラス メンバの API ドキュメントへのポインタを作成します。たとえば、{docref-abbr Visual.animate}Visual.animate の API ドキュメントへのリンクを作成しますが、リンクには「animate」のように animate しか表示されません。
{syntax ...} 句をフォーマットする際には pre の使用を推奨します。これは、中のテキストをモノスペースでフォーマットし、空白文字や改行文字をそのまま保持します。
{pre ...} には、適切に表示するためにその内容は左余白に配置しなければならないという特徴があります。次の例を参照してください。

例: pre テキスト フォーマットの使用
{import * from CURL.IDE.DOCUMENTATION}
{syntax
    {pre
        {ctext
            {with-render-properties
                [{metavar property*} = {metavar value*},]*
                {metavar property} = {metavar value}
                on {metavar renderer2d} do
                {metavar body}
            }
        }
    } ||pre
}

サンプル コードの表示

docstring 句にサンプル コードを含める場合、以下のマークアップ タグを使用します。
サンプル ボックスとコード例の用法は {for-example ...} を参照してください。

非公開および使用禁止の docstring

public または protected 属性で宣言して定義を作成し、これを外部の開発者が使用できないようにするには (「非公開 (unadvertised) アイテムとも呼ばれる)、docstring に次のコードを含めます。
{doc-next
{unadvertised}
}
または
{doc name
{unadvertised}
}
ここで、name は記述するアイテムの名前です。たとえば、mystify というアイテムを非公開にするには次の構文を使います。
{doc-next
    {unadvertised}
}
または
{doc mystify
    {unadvertised}
}
API ドキュメンテーションに非公開のアイテムを表示すると、次のテキストが現れます。
この項目はサポートされていません。内部使用限定となっています。
{unadvertised} には残余引数がありますが、ユーザーへの出力が生成されるときにはこれらは表示されません。したがって、たとえばこのアイテムに関する内部ドキュメントを保護して、ユーザーの企業の内部だけで使用する場合に、これを {unadvertised ...} テキスト フォーマット呼び出しのスコープ内に含めることができます。
ただし、{unadvertised ...} 句が docstring 内で唯一のトップレベルの句でなければなりません。
パブリック API に存在するアイテムの使用を禁止するには、{deprecated ...} 句を使います。これは通常、アイテムが後方互換性のためにサポートされていて、将来は削除される可能性のあることを意味します。

列挙体の記述

列挙体または列挙型はクラスと同じように記述し、少なくとも purpose 句と details (説明) および notes (注意事項) 句を含めるのが適切です。
だたし、これらに加えて列挙体の要素を示す必要があります。数が少ない場合などは (下記の例を参照) 個々に提示して定義します。あるいは、読者が個々の値の意味を明確に判断できる方法で要約します。
列挙型の要素を定義する一般的な方法の 1 つには、短い説明とともに個別にリストして、特定の値の使用による実用的な効果があればその詳細も記します。{details ...} 句の内部に、次の Blend docstring の例題のテキストのような内容を含めます。

例: 列挙体の要素の記述
{import * from CURL.IDE.DOCUMENTATION}
{details
    {itemize
        {item
            {code low} enables 2x oversampling.
        }
        {item
            {code high} enables 4x oversampling; this is more visually
            appealing but slower than {code low}.
        }
    }
}

docstring 句の指定

以下の表には、記述する各アイテムで必要な docstring 句と、オプションで使用する docstring 句が一覧されています。これらの句の詳細は後続のセクションに掲載されています。このテーブルでは次のキーが使われています。
クラス
メソッド
フィールド
アクセッサ
オプション
{purpose ...}必要必要必要必要必要
{parameter ...}必要*必要*N/AN/AN/A
{return-vals ...}N/A必要*N/AN/AN/A
{assumes ...}オプションオプションオプションオプションオプション
{details ...}推奨推奨推奨推奨推奨
{expected-events ...}オプションN/AN/AN/AN/A
{usage ...}オプションオプションオプションオプションオプション
{override ...}オプションオプションN/AオプションN/A
{for-example ...}オプションオプションオプションオプションオプション
{notes ...}オプションオプションオプションオプションオプション
{throws ...}オプションオプションオプションオプションオプション
プロシージャ
テキスト プロシージャ
マクロ
プリミティブ
パッケージ
{purpose ...}必要必要必要必要必要
{return-vals ...}必要*必要*必要*必要*N/A
{assumes ...}オプションオプションオプションオプションN/A
{details ...}推奨推奨推奨推奨推奨
{usage ...}オプションオプションオプションオプションオプション
{for-example ...}オプションオプションオプションオプションオプション
{notes ...}オプションオプションオプションオプションオプション
{throws ...}オプションオプションオプションオプションオプション
パッケージ docstring の例は、前述の「パッケージの記述」を参照してください。
コンストラクタ
ファクトリー
列挙体
{purpose ...}必要必要必要
{parameter ...}必要*必要*N/A
{return-vals ...}N/AオプションN/A
{assumes ...}オプションオプションオプション
{details ...}推奨推奨推奨
{expected-events ...}N/AN/AN/A
{usage ...}オプションオプションオプション
{override ...}オプションオプションN/A
{for-example ...}オプションオプションオプション
{notes ...}オプションオプションオプション
列挙体 : Purpose 句に加え、列挙体の要素の数が少ない場合は個別に挙げて定義するか (Blend などを参照)、あるいは読者が個々の値の意味を明確に判断できる方法で要約します。詳細は「列挙体の記述」を参照してください。
ファクトリー : 通常ファクトリーの戻り値は作成されたオブジェクトなので、このオブジェクトに関して特に注記する点があれば、{return-vals ...} 句を使って示すことをお勧めします。

docstring 句の概要

次の表には各 docstring 句の概要が掲載されています。「段落見出し」とは、API ドキュメンテーション ページでそれぞれの句の内容の前に現れる見出しのことです。{for-example}{notes} および {parameter} 句は docstring 内に複数回表示させることができます。その他の句は 1 度しか表示できません。
docstring 句段落見出し要約
{assumes ...}前提条件記述するアイテムを呼び出す前にあらかじめ true でなければならない条件、または発生する必要のあるイベント。
{details ...}説明Purpose 句とともに、記述するアイテムの全般的な情報を指定します。この句には詳細情報を含め、Purpose 句には要約情報を含めるようにします。
{expected-events ...}Expected-Eventsクラスのインスタンスでイベントが発生する場合はこの句を使ってイベントを指定します。
{for-example ...}記述するアイテムの使用例を提供します。可能な場合は、この例を読者が編集および実行できるような例にします。
{notes ...}注意事項他のカテゴリには収まらない、注記に値する情報を提供します。
{override ...}オーバーライド記述中のアイテムをプログラマーがオーバーライドする際に理解および注意しておくべき情報を提供します。
{parameter ...}パラメータ記述中のアイテムが 1 つまたは複数のパラメータを持つ場合、この句を使ってこれらを説明します。
{purpose ...}目的{details ...} とともに、記述するアイテムの全般的な情報を指定します。Purpose には要約を含め、{details ...} には詳細を含めるようにします。
{return-vals ...}戻り値記述するアイテムが 1 つまたは複数の値を返す場合、この句を使ってこれらを説明します。
{syntax ...}構文マクロまたはプリミティブの有効な構文をそれぞれ指定するためにこの句を使います。
{throws ...}例外のスロー記述中のアイテムがスローできる例外のリストを含めます。
{usage ...}プログラミング注意事項記述中のアイテムの使用法を開発者に提供します。

docstring 句の説明

{assumes ...}

アイテムの呼び出しに関して true であるべき条件が存在する場合、この句を使ってこれらの条件を記述します。たとえば、アイテムが特定の範囲の値を必要とすることをここに記すことができます。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{assumes
text
}
ここで、text は前提条件を表します。
次の例を参照してください。

例: assumes 句の使用
{import * from CURL.IDE.DOCUMENTATION}
{assumes 
    The value of {metavar bits} is between 0 and 255.
}

{details ...}

記述するアイテムについて詳細な情報を提供する場合は {details ...} 句を使います。簡単なアイテムの場合は Purpose 句だけでも十分ですが、Purpose 句では 1 文または 2 文に制限することになっています。したがって、多くの情報を掲載する場合は {details} を追加します。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{details
text
}
ここで、text は説明です。

{expected-events ...}

イベントを受け取る必要のあるクラスでは、この句を使ってこれらのイベントを説明します。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{event event-name,
text
}
ここで、event-name はイベントの名前で、text はイベントの説明です。
次の例を参照してください。

例: event 句の使用
{import * from CURL.IDE.DOCUMENTATION}
{event Reset, 
    Fired when the user presses the Reset button.
}

{for-example ...}

記述するアイテムの使用例を提供するにはこの句を使います。可能な場合は、実行可能な例 (サンプルボックス、別名 playpen) にして、読者が操作できるようにします。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{for-example
text
}
ここで、text は例を説明するテキストで、ここに {example ...} の呼び出しを 1 つ以上含めることができます。
サンプル ボックスにはタイトルがあり、ここで表示内容を簡潔に説明できます。タイトルを指定しない場合は既定のタイトル「Curl の例」が使われますが、挿入する例にふさわしいタイトルを作成することを強くお勧めします。次の例を参照してください。

{import * from CURL.IDE.DOCUMENTATION}
{for-example 
    The following example shows how to create bold text:

    {example 
        title = {text How to Create Bold Text}, 
        {paragraph This is {bold bold text}}
    }
}

{notes ...}

他のカテゴリには当てはまらない、注記に値する情報を提供するにはこの句を使います。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{notes
text
}
ここで text は特記すべき情報です。

{override ...}

開発者がサブクラスを作成する際にこのアイテムをオーバーライドするような状況があれば、この句を使ってそれらの状況を説明します。また、このアイテムをオーバーライドするときにプログラマーか理解または記憶しておくべき情報があればそれも含めます。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{override
text
}
ここで、text は、記述中のアイテムをオーバーライドする状況 (および可能な場合はその方法) の説明です。
次の例を参照してください。

例: override 句の使用
{import * from CURL.IDE.DOCUMENTATION}
{override 
    If you create a class that inherits from {docref Dialog}
    and has a value, override this method.
}

{parameter ...}

記述するアイテムが 1 つまたは複数のパラメータを持つ場合、この句のインスタンスを使って個々のパラメータまたは論理上のパラメータ グループについて説明します。
この句は、次のオブジェクトでパラメータが存在する場合に必要です。
構文 :
{parameter parameter-names,
text
}
ここで、parameter-names は説明したいパラメータ名か論理上のパラメータ グループで、text はその説明です。残余引数の場合、parameter-names の代わりに ... を指定します。
構文に関する注意 : {parameter ...} によって生成されるフォーマットはパラメータ名の後ろにコロンを挿入します。したがって、コロンの後には通常パラメータを説明する名詞句が続きます。この部分は大文字で始めます (英語の場合)。下記の例を参照してください。
必要に応じて、以下の内容を追加してください。(1) パラメータのデータ型。(2) 有効なまたは推奨するパラメータ値の範囲。(3) 既定値。(4) 値に関して API が求める前提条件。(5) 値のスケール変更、正規化、固定化に関する情報。(6) 特定の値の意味が不明瞭な場合はその意味 (例 : 「値 -1min-count が未定義であることを意味します。」)。
次の例を参照してください。

例: parameter 句の使用
{import * from CURL.IDE.DOCUMENTATION}
{parameter sky-color, 
    A {docref String} specifying the color of the sky in your
    world. Valid values are {ctext blue}, {ctext green}, and
    {ctext red}. The default value is {ctext blue}. 
}
{parameter (x, y), 
    The x and y coordinates of the origin. These default to the
    coordinates of the origin of the bounding box.
}
{parameter create-from-url?,
    A Boolean indicating whether the file name should be derived
    from a {docref Url} rather than from a {docref String}, which
    is the default.
}
{parameter ..., 
    The elements to be added to the array.
}

{purpose ...}

記述するアイテムの目的を簡潔に説明するにはこの句を使います。1 つの短い文か 2 つまでのできれば完全な文 (すなわち、主語と述語を持つ文) で目的を述べます。動詞句 (「foo を値 bar に初期化する」) または名詞句 (「foo の抽象基本クラス。」) を使うこともできます。記述するアイテムについて詳細な情報を指定したい場合は、details (説明)句 ({details ...}) を使います。目的は必ず指定しなければなりません。
この句を記述する際には、この情報が記述するアイテムの要約を説明するものであるという点に気をつけてください。特に purpose 句の先頭部分は、API ドキュメンテーションの検索結果の要約ページにも表示されます。
この句は以下のオブジェクトで必要です。
構文 :
{purpose
text
}
ここで、text では記述するアイテムの目的です。
次の例を参照してください。

例: Using the purpose Clause
{import * from CURL.IDE.DOCUMENTATION}
{purpose 
    This class allows you to create a container with a 
    number of overlaid {docref Graphic}s.
}

{return-vals ...}

記述するアイテムが 1 つまたは複数の値を返す場合、この句を使って戻り値について説明します。
この句は、1 つまたは複数の値を返す以下のオブジェクトで必要です。
構文 :
{return-vals
text
}
ここで、text は戻り値の説明です。
次の例を参照してください。

例: return-vals 句の使用
{import * from CURL.IDE.DOCUMENTATION}
{return-vals 
    The {docref View}.  If there is no applicable {docref View},
    this procedure returns {ctext null}. 
}

{syntax ...}

通常はシグネチャを自動的に生成しないマクロやプリミティブでこれを使います。フォーマット構文の詳細は「テキストのフォーマット」を参照してください。
マクロに複数の構文が存在する場合、この句を使って有効な各構文を説明します。
この句は以下のオブジェクトに適用します。
構文 :
{syntax
text
}
ここで、text は有効な各構文の説明です。
たとえば、for-pixel はコンパイラ構文 (Primitive) で、このドキュメントでは {syntax ...} 句が必要です。次の例では、for-pixel の構文がどのように記述されているか示しています。

例: syntax の使用
{import * from CURL.IDE.DOCUMENTATION}

{syntax
    {pre
        {ctext
            {for-pixel
                [tag = {metavar tag},]
                {metavar map-element}[:T][,{metavar map-element2}[:T]]*
                [at {metavar x}[:int], {metavar y}[:int]]
                [in-rectangle
                 {metavar x0}, {metavar y0},
                 {metavar x1}, {metavar y1}]
                [[no-read] [no-write] in {metavar map}]+
                do
                {metavar body}
            }
        }
    } || pre
} || syntax

{throws ...}

この句では、記述するアイテムがスローできる例外についてプログラマーに説明します。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{throws
text
}
ここで、text は可能な例外に関する情報です。

{usage ...}

この句では、記述するアイテムの使用法についてプログラマーに説明します。
この句はオプションです。使用する場合は以下のオブジェクトに適用します。
構文 :
{usage
text
}
ここで、text は使用法に関する情報です。

2 つの例

例 1: 次の例は、Array-of クラスの docstring です。
{doc-next
    {purpose
        Parameterized class for one-dimensional arrays.
    }
    {parameter t,
        The data type of the elements in the array.
    }
    {details
        There are a number of collection types built into
        the Curl language, including:
        {itemize
            {item Arrays}
            {item Hash tables}
            {item Sets}
            {item Strings}
            {item Arguments}
        }
        {ctext Array-of} allows you to create one dimensional
        arrays that can increase in size.  The ordered
        collection classes that are built into the Curl
        language, like {ctext Array-of}, inherit from {docref
        Sequence-of}.  The elements in such collections are
        indexed by a contiguous set of integers, starting at
        0.
    }
    {notes
        A partial hierarchy of the collection classes in the
        Curl language follows:

        {docref Aggregate-of}
        {br} {Fill width = 0.25in} {indent-symbol} {docref Association-of}
        {br} {Fill width = 0.5in} {indent-symbol} {docref HashTable-of}
        {br} {Fill width = 0.5in} {indent-symbol} {docref Sequence-of}
        {br} {Fill width = 0.75in} {indent-symbol} {ctext Array-of}
        {br} {Fill width = 0.25in} {indent-symbol} {docref Array-2-of}
        {br} {Fill width = 0.25in} {indent-symbol} {docref Set-of}
        {br}{docref FastArray-of}{br}

        For more information about collections, see the
        Developer's Guide chapter on {link href = {dguide-url
        "collections.curl"}, Collections}.
    }
}
例 2: 次の例は Array-of.to-Iterator です。
{doc-next
    {purpose
        Returns an {docref Iterator-of} containing each
        element of the array.
    }
    {return-vals
        An {ctext Iterator-of} with the same parameterized
        data type as the elements in {ctext self}.  In other
        words, if {ctext self} is an {ctext {Array-2-of int}},
        this method returns an {ctext {Iterator-of int}}.
    }
    {details
        This method preserves the order of the elements (using 
        the order of the internal representation).  The
        elements are stored for each index in the first
        dimension in turn.  When storing the elements for an
        index in the first dimension, the compiler stores the
        elements for each index in the second dimension in
        turn.  For example, the elements of a {ctext 2 x 3}
        array are stored as follows: 

        {ctext (0,0), (0,1), (0,2), (1,0), (1,1), (1,2)}

    }
    {for-example
        Here is an example that uses an iterator to display
        the elements in a simple 2D array of strings: 
        {example
            title = {text Displaying an {ctext Array-2-of
                                            String}}, 
            {value
                || String の2次元配列を作成します。
                let my-array:{Array-2-of String} =
                    {new {Array-2-of String}, 2, 3}

                || 要素を配列に入れます。
                set my-array[0, 0] = "Harry"
                set my-array[1, 0] = "Sally"
                set my-array[0, 1] = "Tom"
                set my-array[1, 1] = "Mary"
                set my-array[0, 2] = "John"
                set my-array[1, 2] = "Anne"

                || Iterator-of を上記の set から作成します。
                let my-iterator:{Iterator-of String} =
                    {my-array.to-Iterator}

                || VBox を使用して my-iterator のコンテンツを表示します。
                || my-iterator のコンテンツを VBox に加える反復処理を行い、
                || VBoxで表示します。
                let message:VBox = {VBox}
                {for each-element:String in my-iterator do
                    {message.add each-element}
                }
                message
            }
        }
    }
    {notes
        Alternatively, you can use a {docref for} container loop
        to achieve the same results.  Where possible, you should
        use a {ctext for} loop in case this iteration mechanism
        is overridden, producing unexpected results.
    }
}