Indexar el valor de retorno de una funciónEl desafío de hoy:
f=Function({}, {1,2,3});
tmp=f();
y=tmp[1]; // works
x=f()[1] // doesn't work
Entender el problema ayuda mucho a entender cómo funciona JSL : - )
Automatización y scriptingRe: Indexar el valor de retorno de una funciónEl problema inverso:
names default to here(1);
x=1;
Eval(x=1); // "does the same"
x= Expr(hello);
Eval(x= Expr(hello)); // fails
Re: Indexar el valor de retorno de una función¿Cabeza evalúa su argumento?
En cuanto a la asignación , ¿evalúa sus argumentos?
1. arg: no
2. arg: sí
Si necesita evaluar una expresión "manualmente" [ antes de tomar el primer elemento del resultado], utilice Eval():
x=f()[1] // doesn't work
x=Eval(f())[1] // works
Respecto al pegamento :
cualquier argumento: sí
.... y Eval:
¡sí, claro!
Además, hay una evaluación adicional del valor de retorno *) tras una primera evaluación del argumento.
Eval(print(1);x= Expr(hello);print(x); Expr(print(2)));
asigna correctamente x=Expr(hola) e imprime:

*) -> enlace / documentación / comunidad?
Re: Indexar el valor de retorno de una función
If you need to evaluate an expression "manually" [
antes taking the fist item from the result], use Eval():
</CODE>
<HR />
</BLOCKQUOTE>
<P>En mi opinión, esto crea código difícil de leer y no debería usarse; simplemente devuelve el valor y úsalo. Si sabes que solo quieres un índice específico ( <STRONG>y sabes cuántos hay</STRONG> ), puedes usar una lista y descartar el 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, _);
asigna correctamente x=Expr(hola) y estampas:
En mi opinión, esto debería generar un error (actualmente, considero que es un comportamiento inesperado). Supongo que esto funciona debido al comportamiento de Glue (devuelve el último resultado y luego se evalúa).
Names Default To Here(1);
Eval(
x = Expr(hello);
Print(x);
);<BR />// Eval(Glue(Assign(x, Expr(hello)), Print(x)));
vs ( Nombre sin resolver: hola en el acceso o evaluación de 'hola', hola/*###*/ )
Names Default To Here(1);
Eval(
x = Expr(hello);
);<BR />// Eval(Assign(x, Expr(hello)));
Siento que esto es lo que siempre debería suceder si se usa Eval en un caso como este (intento de evaluar Expr() -> falla al evaluarlo -> arroja error). @EvanMcCorkle .
Ver más...
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 desea almacenar solo el nombre de saludo en la variable, use Name Expr()
Names Default To Here(1);
x = NameExpr(hello);
Guía de scripts > Métodos de programación > Expresiones avanzadas, macros y listas. Este texto tiene algunos errores, pero en general es correcto y una buena lectura.
Re: Indexar el valor de retorno de una funciónGracias por los ejemplos adicionales y tus pensamientos.
Re: Indexar el valor de retorno de una funciónAh, las cosas se vuelven mucho más claras cuando tomamos una función que está definida con argumentos :
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)