def (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

シグネチャ

def [access] name[:type] = value
  [, name[:type] = value] ...

暗黙的な型で定数を宣言します。

説明

現在のコード ブロックで一つ又は複数の新しい定数を宣言します。その定数の型は、初期化時に使用される value 式の型から推測されます。新しい定数は暗黙的に constant として宣言され、初期化後は違う値が設定されません。ただし、その定数がクラス インスタンスの場合は、そのクラス内部の状態は変更可能です。
let 構文とは異なり、value 式が必要で、たとえ allow-implicit-any-declarations? コンパイラ ディレクティブ が有効であっても type 式はオプションです。定数の宣言型は value 式のコンパイル時の型になるので、次のようになります。
def x = {func}
これは次と同じ意味です。
let constant x:{compile-time-type-of {func}} = {func}
def 宣言は 3 つの状況のいずれかで使用されます。
  1. アプレット、パッケージ、又はスクリプトのトップ レベル : コンポーネント全体でアクセス可能なグローバル定数を定義します。アプレットでは、トップ レベルの def 宣言はテキストと区別するためにCurlブラケットで囲む必要があります。
  2. クラスのトップ レベル : グローバルな クラス定数 を定義します。
  3. コード コンテキスト : これを含むコード ブロック内でのみアクセス可能な新しい定数を定義します。
access 属性は def をトップ レベルで使用する場合にみ適用可能で、packagelibraryまたは public となります。指定されない場合は、既定のアクセス属性である package となります。宣言したパッケージの外からもアクセス可能なグローバル定数にしたい場合は、public を指定してください。スクリプトやアプレット内のグローバル定数のアクセス値を public で宣言しても、他のコンポーネントがそのグローバル定数にアクセスできないので、意味がありません。
次の構文のように、複数値を返す関数から def で複数の定数を初期化することも可能です。
def (name1[:type1], name2[:type2] [,...]) = {function}
この場合、関数によって返される値と同じ順番で定数を宣言しなければなりませんが、値は後ろから省略することが可能です。例えば、関数が 4 つの値を返す場合、def では最後の 1 つを省略、2 つを省略、3 つを省略することが可能です。下記の例を参照してください。
アプレット内でグローバル定数を宣言するのに使用される場合を除いて、def 宣言はCurlブラケットで囲まれる必要はありません。ただし、形式の問題上、グローバル定数やローカル定数の宣言を簡単に区別できるよう、def をトップ レベルやクラス レベルで使用する時は常に中かっこで囲むことを推奨します。
詳細や例に関しては、『Curl 開発者ガイド』の変数セクション を参照してください。

|| トップレベル, グローバル定数
{def public ten = 10, hundred = 100}
||
def count = 0  || アプレットの内部でなければ、Curlブラケットは必要ありません。
||
{define-class MyClass
  || A class constant.
  {def thousand = 1000}
}
||
|| ローカル定数
|| 'do'クローズの外からは参照できません。:
{do
    def x = 42
    def str1:String       || Error: no initial value
    || 
    || 複数の値を返す関数から、一つ以上の値を
    || 割り当てることができます。:
    def str-value = "42"
    def value1 = {str-value.to-int}
    def (value2, n-chars-consumed) = {str-value.to-int}
}
導入: バージョン 6.0