No creo que haya una manera directa de hacer esto, pero hay una manera indirecta horrible y fea que se me ocurre que fue un desafío divertido que se me ocurrió:
Entonces, JMP reacciona de manera predecible cuando intenta evaluar una función con el número correcto e incorrecto de argumentos. Por ejemplo:
beta density()
nos dará:

Pero, lo siguiente no dará error y devolverá "." porque Beta Density necesita 3 argumentos (x, alfa y beta).
beta density(empty(),empty(),empty())
De hecho, hasta que alcancemos el número máximo de argumentos que espera la función, seguiremos obteniendo "." Es decir, hasta que alcancemos el 1+ el número máximo de argumentos, que es 6:
beta density(empty(),empty(),empty(),empty(),empty(),empty())
Lo que nos da:

Entonces, aprovechemos esto creando una función (fea) que prueba hasta 10 argumentos potenciales y devuelve los argumentos mínimo y máximo (y, por supuesto, podría generalizar esto si lo desea a un número arbitrariamente grande de argumentos, pensé 10 los cubriría a todos, así que lo hice por fuerza bruta). La función responde así:

Algunas funciones, como Random Normal(), parecen comportarse de forma extraña, quizás porque no tienen un número mínimo de argumentos, o porque hay algo diferente en ellas. No estoy seguro. Y algunas funciones, como Interest Rate(), parecen estar felices de aceptar cualquier número de argumentos hasta el máximo probado. Por lo tanto, lejos de ser perfecto, sería bueno tener una función de búsqueda jsl que devuelva los detalles directamente. En cualquier caso, aquí está el código a continuación y se adjunta como un script.
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 );
);
Aquí hay una función que toma la genial idea de Julian y acorta un poco el código.
La función tiene un segundo argumento opcional, que especifica cuándo salir (el valor predeterminado es 10 argumentos).
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
);
Los resultados coinciden con los proporcionados por Julian, excepto en el caso normal aleatorio. No investigué por qué el mío informa {0,2} y sus informes {0,. }
