我不相信有直接的方法可以做到這一點,但我認為有一種可怕而醜陋的間接方法是一個有趣的挑戰:
因此,當您嘗試使用正確和錯誤的參數數量評估函數時,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 的絕妙想法並稍微縮短代碼的函數。
該函數有一個可選的第二個參數,指定何時退出(默認為 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
);
結果與 Julian 提供的結果相匹配,隨機正常情況除外。 沒有研究為什麼我的報告是 {0,2} 而他的報告是 {0,. }
