Indicizzazione del valore di ritorno di una funzioneLa sfida di oggi:
f=Function({}, {1,2,3});
tmp=f();
y=tmp[1]; // works
x=f()[1] // doesn't work
comprendere il problema aiuta molto a capire come funziona JSL : - )
Automazione e scriptingRe: Indicizzazione del valore di ritorno di una funzioneil problema inverso:
names default to here(1);
x=1;
Eval(x=1); // "does the same"
x= Expr(hello);
Eval(x= Expr(hello)); // fails
Re: Indicizzazione del valore di ritorno di una funzioneHead valuta la sua argomentazione?
per quanto riguarda l'assegnazione , valuta i suoi argomenti?
1. arg: no
2. arg: sì
Se è necessario valutare un'espressione "manualmente" [ prima di prendere il primo elemento dal risultato], utilizzare Eval():
x=f()[1] // doesn't work
x=Eval(f())[1] // works
riguardo alla colla :
qualsiasi argomento: sì
.... e valutazione:
Sì, naturalmente!
oltre a ciò, c'è una valutazione aggiuntiva del valore di ritorno *) - dopo una prima valutazione dell'argomento. Quindi
Eval(print(1);x= Expr(hello);print(x); Expr(print(2)));
assegna correttamente x=Espr(ciao) e stampa:

*) -> link / documentazione / community?
Re: Indicizzazione del valore di ritorno di una funzione
If you need to evaluate an expression "manually" [
Prima taking the fist item from the result], use Eval():
</CODE>
<HR />
</BLOCKQUOTE>
<P>A mio parere, questo crea codice difficile da leggere e non dovrebbe essere utilizzato, basta restituire il valore e usarlo. Se sai di volere solo un indice specifico ( <STRONG>e sai quanti ce ne sono</STRONG> ), puoi usare un elenco e "buttare via" il resto.</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, _);
assegna correttamente x=Espr(ciao) e stampe:
A mio parere, questo dovrebbe generare un errore (al momento, a mio parere, è un comportamento inaspettato). Immagino che funzioni grazie al comportamento di Glue (restituisce l'ultimo risultato e poi viene valutato).
Names Default To Here(1);
Eval(
x = Expr(hello);
Print(x);
);<BR />// Eval(Glue(Assign(x, Expr(hello)), Print(x)));
vs ( Nome non risolto: ciao nell'accesso o nella valutazione di 'ciao', ciao/*###*/ )
Names Default To Here(1);
Eval(
x = Expr(hello);
);<BR />// Eval(Assign(x, Expr(hello)));
Penso che questo sia ciò che dovrebbe sempre accadere se Eval viene utilizzato in un caso come questo (tentativo di valutare Expr() -> errore nella valutazione -> viene generato un errore). @EvanMcCorkle .
Scopri di più...
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);
);
Se vuoi memorizzare solo il nome hello nella variabile, usa Name Expr()
Names Default To Here(1);
x = NameExpr(hello);
Guida alla scrittura di script > Metodi di programmazione > Espressioni, macro ed elenchi avanzati. Contiene alcuni errori, ma nel complesso è corretto e una buona lettura.
Re: Indicizzazione del valore di ritorno di una funzioneGrazie per gli esempi aggiuntivi e per i tuoi pensieri.
Re: Indicizzazione del valore di ritorno di una funzioneAh, le cose diventano molto più chiare quando prendiamo una funzione definita con argomenti :
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)