Indexer la valeur de retour d'une fonctionLe défi du jour :
f=Function({}, {1,2,3});
tmp=f();
y=tmp[1]; // works
x=f()[1] // doesn't work
Comprendre le problème aide beaucoup à comprendre le fonctionnement de JSL 
Automatisation et scriptageRe: Indexation de la valeur de retour d'une fonctionle problème inverse :
names default to here(1);
x=1;
Eval(x=1); // "does the same"
x= Expr(hello);
Eval(x= Expr(hello)); // fails
Re: Indexation de la valeur de retour d'une fonctionLa tête évalue-t-elle son argument ?
Concernant la fonction assign , évalue-t-elle ses arguments ?
1. arg : non
2. Argument : oui
Si vous devez évaluer une expression « manuellement » [ avant de prendre le premier élément du résultat], utilisez Eval() :
x=f()[1] // doesn't work
x=Eval(f())[1] // works
concernant la colle :
tous les arguments : oui
... et évaluation :
oui bien sûr!
Par ailleurs, il y a une évaluation supplémentaire de la valeur de retour *) - après une première évaluation de l'argument.
Eval(print(1);x= Expr(hello);print(x); Expr(print(2)));
assigne correctement x=Expr(bonjour) et affiche :

*) -> lien / documentation / communauté ?
Re: Indexation de la valeur de retour d'une fonction
If you need to evaluate an expression "manually" [
avant taking the fist item from the result], use Eval():
</CODE>
<HR />
</BLOCKQUOTE>
<P>À mon avis, cela crée un code difficile à lire et ne devrait pas être utilisé ; il suffit de renvoyer la valeur et de l'utiliser. Si vous savez que vous voulez seulement un index spécifique ( <STRONG>et que vous connaissez leur nombre</STRONG> ), vous pouvez utiliser une liste et ignorer le reste.</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, _);
attribue correctement x=Expr(bonjour) et des impressions :
À mon avis, cela devrait provoquer une erreur (actuellement, il s'agit d'un comportement inattendu). Je suppose que cela fonctionne grâce au fonctionnement de Glue (qui renvoie le dernier résultat avant son évaluation).
Names Default To Here(1);
Eval(
x = Expr(hello);
Print(x);
);<BR />// Eval(Glue(Assign(x, Expr(hello)), Print(x)));
vs ( Nom non résolu : hello lors de l'accès ou de l'évaluation de 'hello', hello/*###*/ )
Names Default To Here(1);
Eval(
x = Expr(hello);
);<BR />// Eval(Assign(x, Expr(hello)));
J'ai l'impression que c'est ce qui devrait toujours se produire si Eval est utilisé dans un cas comme celui-ci (tentative d'évaluation de Expr() -> échec de l'évaluation -> levée d'une erreur). @EvanMcCorkle .
Voir plus...
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);
);
Si vous souhaitez stocker uniquement le nom « hello » dans une variable, utilisez NameExpr().
Names Default To Here(1);
x = NameExpr(hello);
Guide de programmation > Méthodes de programmation > Expressions avancées, macros et listes : ce guide contient quelques erreurs, mais dans l’ensemble, il est correct et intéressant à lire.
Re: Indexation de la valeur de retour d'une fonctionMerci pour ces exemples supplémentaires et vos réflexions.
Re: Indexation de la valeur de retour d'une fonctionAh, les choses deviennent beaucoup plus claires lorsqu'on prend une fonction définie avec des arguments :
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)