Hier ist eine interessante Frage: Kann ich die Anzahl der Argumente, die eine Funktion erwartet, oder eine Liste der Argumente, die eine Funktion erwartet, programmgesteuert über JSL abrufen?
Hier ist ein Beispiel: Angenommen, ich habe die Funktion
beta density()
Die Dokumentation sagt mir, dass es 4 Parameter hat (x, alpha, beta, , ) – zwei davon sind erforderlich und zwei haben Standardwerte. Angenommen, ich wollte entweder die Liste der Parameter oder nur die Anzahl der Elemente erhalten, die die Funktion erwartet. Gibt es eine Möglichkeit, diese Informationen über JSL für eine beliebige Funktion zu erhalten?
Ich glaube nicht, dass es einen direkten Weg gibt, aber es gibt einen schrecklichen und hässlichen indirekten Weg, den ich mir vorstellen kann, der eine lustige Herausforderung war:
Daher reagiert JMP vorhersehbar, wenn Sie versuchen, eine Funktion mit der richtigen und der falschen Anzahl von Argumenten auszuwerten. Zum Beispiel:
beta density()
wird uns geben:

Das Folgende wird jedoch keinen Fehler verursachen und "." weil Beta Density 3 Argumente benötigt ( x, alpha und beta).
beta density(empty(),empty(),empty())
Bis wir die maximale Anzahl von Argumenten erreicht haben, die die Funktion erwartet, erhalten wir weiterhin "." Das heißt, bis wir die 1 + die maximale Anzahl von Argumenten erreichen, also 6:
beta density(empty(),empty(),empty(),empty(),empty(),empty())
Was uns gibt:

Lassen Sie uns dies ausnutzen, indem wir eine (hässliche) Funktion erstellen, die bis zu 10 potenzielle Argumente testet und die minimalen und maximalen Argumente zurückgibt (und Sie könnten dies natürlich verallgemeinern, wenn Sie Lust dazu haben, auf eine beliebig große Anzahl von Argumenten, dachte ich 10 würde alle abdecken, also habe ich es einfach mit roher Gewalt gemacht). Die Funktion antwortet wie folgt:

Einige Funktionen, wie Random Normal(), scheinen sich seltsam zu verhalten, vielleicht weil sie keine Mindestanzahl von Argumenten haben oder weil etwas anders an ihnen ist. Ich bin mir nicht sicher. Und einige Funktionen, wie Interest Rate(), scheinen gerne eine beliebige Anzahl von Argumenten bis zum getesteten Maximum zu akzeptieren. Also alles andere als perfekt, und es wäre schön, eine jsl-Lookup-Funktion zu haben, die Details direkt zurückgibt. In jedem Fall ist hier der Code unten und als Skript angehängt.
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 );
);
Hier ist eine Funktion, die Julians coole Idee aufnimmt und den Code etwas verkürzt.
Die Funktion hat ein optionales zweites Argument, das angibt, wann es beendet werden soll (Standard sind 10 Argumente).
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
);
Die Ergebnisse stimmen mit denen von Julian überein, außer im zufälligen Normalfall. Habe nicht untersucht, warum meiner {0,2} und seine Berichte {0, meldet. }
