Non credo che ci sia un modo diretto per farlo, ma c'è un modo indiretto orribile e brutto a cui posso pensare che è stata una sfida divertente da inventare:
Pertanto, JMP reagisce in modo prevedibile quando si tenta di valutare una funzione con il numero di argomenti giusto e sbagliato. Per esempio:
beta density()
ci darà:

Ma quanto segue non comporterà errori e restituirà "." perché Beta Density necessita di 3 argomenti (x, alpha e beta).
beta density(empty(),empty(),empty())
Infatti, finché non raggiungiamo il numero massimo di argomenti previsti dalla funzione, continueremo a ottenere "." Cioè, finché non raggiungiamo 1+ il numero massimo di argomenti, che è 6:
beta density(empty(),empty(),empty(),empty(),empty(),empty())
Il che ci dà:

Quindi, sfruttiamo questo costruendo una (brutta) funzione che verifica fino a 10 potenziali argomenti e restituisce gli argomenti minimo e massimo (e, naturalmente, potresti generalizzare questo se ne hai voglia a un numero arbitrariamente grande di argomenti, ho pensato 10 li coprirebbe tutti, quindi l'ho fatto solo con la forza bruta). La funzione risponde così:

Alcune funzioni, come Random Normal(), sembrano comportarsi in modo strano, forse perché non hanno un numero minimo di argomenti o perché hanno qualcosa di diverso. Non ne sono sicuro. E alcune funzioni, come Interest Rate() sembrano essere felici di accettare qualsiasi numero di argomenti fino al massimo testato. Quindi, tutt'altro che perfetto, e sarebbe bello avere una funzione di ricerca jsl che restituisca direttamente i dettagli. In ogni caso, ecco il codice qui sotto, e allegato come 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 );
);
Ecco una funzione che prende la bella idea di Julian e accorcia un po' il codice.
La funzione ha un secondo argomento facoltativo, che specifica quando uscire (il valore predefinito è 10 argomenti).
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
);
I risultati corrispondono a quelli forniti da Julian, tranne nel caso normale casuale. Non ho esaminato il motivo per cui i miei rapporti {0,2} e i suoi rapporti {0,. }
