Je ne crois pas qu'il existe un moyen direct de le faire, mais il existe une manière indirecte horrible et laide à laquelle je peux penser que c'était un défi amusant à relever:
Ainsi, JMP réagit de manière prévisible lorsque vous essayez d'évaluer une fonction avec le bon et le mauvais nombre d'arguments. Par exemple:
beta density()
va nous donner :

Mais, ce qui suit ne générera pas d'erreur et renverra "." car la densité bêta a besoin de 3 arguments (x, alpha et bêta).
beta density(empty(),empty(),empty())
En fait, jusqu'à ce que nous atteignions le nombre maximum d'arguments attendus par la fonction, nous continuerons à obtenir "." C'est-à-dire, jusqu'à ce que nous atteignions le 1+ le nombre maximum d'arguments, qui est 6 :
beta density(empty(),empty(),empty(),empty(),empty(),empty())
Ce qui nous donne :

Alors, exploitons cela en construisant une fonction (laide) qui teste jusqu'à 10 arguments potentiels et renvoie les arguments min et max (et bien sûr, vous pouvez généraliser cela si vous en avez envie à un nombre arbitrairement grand d'arguments, j'ai pensé 10 les couvrirait tous, alors je l'ai fait par force brute). La fonction répond ainsi :

Certaines fonctions, comme Random Normal() semblent se comporter étrangement, peut-être parce qu'elles n'ont pas de nombre minimum d'arguments, ou parce qu'elles ont quelque chose de différent. Je ne suis pas sûr. Et certaines fonctions, comme Interest Rate() semblent être heureuses d'accepter n'importe quel nombre d'arguments jusqu'au maximum testé. Donc, loin d'être parfait, et ce serait bien d'avoir une fonction de recherche jsl qui renverrait directement les détails. Dans tous les cas, voici le code ci-dessous, et joint en tant que 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 );
);
Voici une fonction qui reprend l'idée géniale de Julian et raccourcit un peu le code.
La fonction a un deuxième argument facultatif, spécifiant quand quitter (la valeur par défaut est de 10 arguments).
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
);
Les résultats correspondent à ceux fournis par Julian, sauf dans le cas normal aléatoire. Je n'ai pas cherché à comprendre pourquoi le mien rapporte {0,2} et ses rapports {0,. }
