我不相信有直接的方法可以做到这一点,但我认为有一种可怕而丑陋的间接方法是一个有趣的挑战:
因此,当您尝试使用正确和错误的参数数量评估函数时,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,. }
