以下のコードは機能しません。b/c JSL は、関数内で実行時に空の変数を評価するのではなく、関数に空の変数を渡そうとしたときに空の変数を評価します。
isEmptyTest = Function({var},
return(isempty(var));
);
isEmptyTest(emptyVar);
これが変わったらすごいですね。
はい、Case 1 で使用しようとしていました。 ユーザー設定ファイルを利用するツールを構築していました。 変数はユーザー定義のファイルからロードされるため、変数は存在する場合も存在しない場合もあり、true/false に設定される場合もあればされない場合もあります。 私は、真実に達すると終了するため、「or」ステートメントを実行できることに気づくまで、これをテストするラッパー関数を構築することを望んでいました。
if(isempty(var) | !var,
//run code)
);
変数がまだ宣言されていない場合、これはエラーにはなりません。Truthy を通知し、他の依存関係をチェックせずに if ステートメント内のコードの実行に進みます。 変数が定義されている場合は、それが true かどうかを確認できます。
シンボルテーブルは、これまでに使用されたすべての変数を追跡します。セット値に。 変数が設定されたことがない場合、その変数は初期化されていないため、それを使用するとエラーになる可能性があります。
ビルトインisEmpty()関数は、いくつかの異常な状況から特別なケースを作成します。
ケース1 : 以前に使用されたことのない変数
Is Empty(neverSeenBefore) = 1;
print(neverSeenBefore)
/*:
Name Unresolved: neverSeenBefore in access or evaluation of 'neverSeenBefore' , neverSeenBefore/*###*/
名前は未解決JMP がシンボル テーブルを調べましたが、名前が見つからなかったことを意味します。
ケース2 (通常の場合): 組み込み関数によって返された値に設定された変数空の()関数、または empty() を返した別の関数
ev=empty(); show(isempty(ev),ev);
/*:
Is Empty(ev) = 1;
ev = Empty();
空かどうかをテストする場合は、空の()変数を初期化する関数。
ケース3 : 組み込みによってクリアされた変数グローバルをクリア()関数
ev2=42; clear globals(ev2); show(isempty(ev2),ev2);
Is Empty(ev2) = 1;
ev2 = ev2;
使用するグローバルをクリア()実稼働コードでは良いアイデアではありませんが、コードを開発する際には役立つ可能性があります。 シンボルテーブルからシンボルを削除するのではなく、その値を削除します。値の empty() も残しません。 使用方法に応じて、empty() または missing のように動作する場合があります。
JSL は、ユーザーが作成した関数に引数を値で渡し、関数が使用するコピーを作成します。 JMP の将来のバージョンでは、参照による引数の受け渡しが可能になる可能性があります。 この時点で、初期化されていない変数を参照によって渡すとどうなるかを見ていきます。