この式は、標準の
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"}
}