ここに興味深い質問があります:関数が期待する引数の数、または関数が期待する引数のリストをJSL経由でプログラムで取得できますか?
ここに例があります:私が関数を持っているとしましょう
beta density()
ドキュメントには、4つのパラメーターがあることがわかります(x, alpha, beta, , ) - そのうち 2 つが必須で、2 つがデフォルト値です。 パラメーターのリスト、または関数が期待するアイテムの数だけを取得したいとします。 任意の関数について、JSL を介してその情報を取得する方法はありますか?
これを行う直接的な方法があるとは思いませんが、考えつくのが楽しい挑戦であると考えることができる恐ろしく醜い間接的な方法があります。
したがって、正しい数の引数と間違った数の引数を使用して関数を評価しようとすると、JMP は予測どおりに反応します。 例えば:
beta density()
私たちに与えます:

ただし、次の場合はエラーにならず、"." が返されます。 Beta Density には 3 つの引数 (x、alpha、および beta) が必要なためです。
beta density(empty(),empty(),empty())
実際、関数が期待する引数の最大数に達するまで、「.」を取得し続けます。つまり、1+ に到達するまで、引数の最大数は 6 です。
beta density(empty(),empty(),empty(),empty(),empty(),empty())
これにより、次のことがわかります。

では、これを利用して、最大 10 個の潜在的な引数をテストし、最小引数と最大引数を返す (醜い) 関数を作成してみましょう (もちろん、必要に応じて任意の数の引数に一般化することもできます。 10 はそれらすべてをカバーするので、私は力ずくでそれを行いました)。 関数は次のように応答します。

Random Normal() のような一部の関数は、おそらく引数の最小数がないため、またはそれらについて何か異なるため、奇妙な動作をしているように見えます。 わからない。 また、Interest Rate() などの一部の関数は、テストされた最大値まで任意の数の引数を受け入れて満足しているようです。 したがって、完璧にはほど遠いので、詳細を直接返す jsl ルックアップ関数があればいいのにと思います。 いずれにしても、以下のコードがスクリプトとして添付されています。
getRecArgs = Function( {funcHead},
min = .;
max = .;
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 1,
max = 1
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 2,
max = 2
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 3,
max = 3
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 4,
max = 4
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 5,
max = 5
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 6,
max = 6
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 7,
max = 7
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 8,
max = 8
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 8,
max = 8
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 9,
max = 9
)
);
If( Eval( Parse( Eval Insert( "if(isMissing(try(^funcHead^(empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty(),empty()),0)),1,0);" ) ) ),
If( Is Missing( min ),
min = 10,
max = 10
)
);
If( Is Missing( min ),
min = 0
);
Return( min, max );
);
Julian のクールなアイデアを取り入れ、コードを少し短縮した関数を次に示します。
関数にはオプションの 2 番目の引数があり、いつ終了するかを指定します (デフォルトは 10 個の引数)。
getNumArgBand = Function( {str, max = 10},
{default local},
fctExpr = Parse( Eval Insert( "^str^()" ) );
res = [];
For Each( {i}, 0 :: max,
Insert Into( res,
Try( Eval( Name Expr( fctExpr ) ); 1, 0 )
);
Insert Into( fctExpr, Empty() );
);
Return( Eval List( {Min( Loc( res ) ), Max( Loc( res ) )} - 1 ) ); //account for 0-indexing
);
結果は、ランダムな通常のケースを除いて、ジュリアンによって提供されたものと一致します。 私のレポート {0,2} と彼のレポート {0,. }
