Indizieren des Rückgabewerts einer FunktionDie heutige Herausforderung:
f=Function({}, {1,2,3});
tmp=f();
y=tmp[1]; // works
x=f()[1] // doesn't work
Das Verständnis des Problems hilft sehr dabei, die Funktionsweise von JSL zu verstehen : - )
Automatisierung und SkripterstellungBetreff: Indizierung des Rückgabewerts einer Funktiondas inverse Problem:
names default to here(1);
x=1;
Eval(x=1); // "does the same"
x= Expr(hello);
Eval(x= Expr(hello)); // fails
Betreff: Indizierung des Rückgabewerts einer FunktionBewertet Head seine Argumente?
Bewertet die Funktion `assign` ihre Argumente?
1. Argument: nein
2. Argument: ja
Wenn Sie einen Ausdruck "manuell" auswerten müssen [ bevor Sie das erste Element aus dem Ergebnis entnehmen], verwenden Sie Eval():
x=f()[1] // doesn't work
x=Eval(f())[1] // works
zum Thema Klebstoff :
beliebige Argumente: ja
... und Eval:
Ja natürlich!
Darüber hinaus erfolgt eine zusätzliche Auswertung des Rückgabewerts *) – nach einer ersten Auswertung des Arguments.
Eval(print(1);x= Expr(hello);print(x); Expr(print(2)));
weist x=Expr(hello) korrekt zu und gibt Folgendes aus:

*) -> Link / Dokumentation / Community?
Betreff: Indizierung des Rückgabewerts einer Funktion
If you need to evaluate an expression "manually" [
vor taking the fist item from the result], use Eval():
</CODE>
<HR />
</BLOCKQUOTE>
<P>Meiner Meinung nach erzeugt das schwer lesbaren Code, der vermieden werden sollte. Geben Sie einfach den Wert zurück und verwenden Sie diesen. Wenn Sie nur einen bestimmten Index benötigen ( <STRONG>und wissen, wie viele es gibt</STRONG> ), können Sie eine Liste verwenden und den Rest verwerfen.</P>
<BR />
<PRE><CODE class=" language-jsl">Names Default To Here(1);
return_list = Function({}, {Default Local}, return({1,2,3}));
{res, _, _} = return_list();
show(res, _);
korrekt zuweist x=Expr(hello) und Drucke:
Meiner Meinung nach sollte das zu einem Fehler führen (derzeit ist das Verhalten meiner Meinung nach unerwartet). Ich vermute, dass es aufgrund der Funktionsweise von Glue funktioniert (es gibt das letzte Ergebnis zurück, das dann ausgewertet wird).
Names Default To Here(1);
Eval(
x = Expr(hello);
Print(x);
);<BR />// Eval(Glue(Assign(x, Expr(hello)), Print(x)));
vs ( Name nicht aufgelöst: hello in Zugriff oder Auswertung von 'hello' , hello/*###*/ )
Names Default To Here(1);
Eval(
x = Expr(hello);
);<BR />// Eval(Assign(x, Expr(hello)));
Ich finde, genau so sollte es immer ablaufen, wenn Eval in einem solchen Fall verwendet wird (Versuch, Expr() auszuwerten -> Auswertung schlägt fehl -> Fehler auslösen). @EvanMcCorkle .
Mehr anzeigen...
Names Default To Here(1);
a = 1;
Try(
Eval(
x = Expr(hello);
y = Expr(a);
);
,
Write("\!NFirst Example: ", exception_msg);
);
Try(
Eval(
y = Expr(a);
x = Expr(hello);
);
,
Write("\!Second Example: ", exception_msg);
);
Wenn Sie nur den Namen „Hallo“ in einer Variablen speichern möchten, verwenden Sie NameExpr().
Names Default To Here(1);
x = NameExpr(hello);
Skripting-Leitfaden > Programmiermethoden > Erweiterte Ausdrücke, Makros und Listen: Dieser Leitfaden enthält zwar einige Fehler, ist aber insgesamt korrekt und lesenswert.
Betreff: Indizierung des Rückgabewerts einer FunktionVielen Dank für die zusätzlichen Beispiele und Ihre Anmerkungen.
Betreff: Indizierung des Rückgabewerts einer FunktionAh, die Sache wird viel klarer, wenn wir eine Funktion betrachten , die mit Argumenten definiert ist :
g=Function({x}, {1,2,3});
x=g()[1] // doesn't work (uses the function itself and takes the first element)
x=g("")[1] // works -> 1 (runs the function - then takes the first element)