if-non-null (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

シグネチャ

{if-non-null [var[:type] =] expr [, ...] then
  if-body
[elseif cond then elseif-body] ...
[else else-body]
}

null 比較の特殊バージョンの if

説明

この式は、標準の if 式と似ていますが、ブール値の条件を評価する代わりに式 expr の値を null と比較します。その場合、その値にローカル定数の変数を設定できます。expr が non-null の場合、if-body が評価されます。それ以外の場合は、標準の if 式と同様に、任意の elseif 句と最終の else 句が評価されます(記入されている場合)。else 句が指定されている場合、標準の if 式と同様に、if-non-null 式は選択された句に応じて値を生成します。次に例を示します。
let str-to-use:String =
    {if-non-null str = {get-possibly-null-string} then
        str
     else
        "default string"
    }
var を指定した場合、expr が non-null の場合に expr の値が if-body 内で指定された名前で定数の変数に代入されます。var のデータ型は、指定した type です。データ型の指定がない場合は、既定で expr のデータ型の non-null 変形(variant)型になります。let の代入と異なり、expr は次のように var と同一になる場合があります。
{define-proc public {use-string str:String}:void 
    || ...
}
{define-proc {use-string-if-exists str:#String}:void
    {if-non-null str = str then
        {use-string str}
    }
}
このため、expr が単純な識別子の場合には、前述の例は次のようにもコーディングできます。
{if-non-null str then
    {use-string str}
}
複数の条件をカンマで区切る場合は、このように指定します。この機能は API のバージョン 6.0 で導入されました。その場合、連続する各式は、前の式が non-null の場合にのみ評価されます。if-body は、全てが non-null の場合にのみ評価され、そうでない場合は、elseif または else 句へ処理が移ります。次に例を示します。
let table:#HashTable

|| ...

{if-non-null table, foo = {table.get-if-exists "foo"} then
    {use-foo foo}
 else
    {error "no foo"}
}