subst() - sustituto() 2.0☐ Nueva característica interesante
☐ ¡podría ayudar a muchos usuarios!
☑ elimina algo que parece un "error"
☑ Es bueno tenerlo
☐ nadie lo necesita
¿Qué inspiró esta solicitud de lista de deseos?
Substitute es una función muy poderosa para el manejo de expresiones:
Uso de JSL para desarrollar aplicaciones eficientes y robustas (EU 2018 415)
Una gran desventaja de Substitute : evalúa sus argumentos: (
Por lo tanto, las expresiones con Substitute() se vuelven bastante largas y difíciles de leer. Además de eso, un nuevo programador de JSL tiene que aprender la sintaxis correcta; nadie espera que todas esas Expr() sean necesarias.
Ejemplo:
Substitute( Expr( a + Sqrt( a ) ), Expr( a ), Expr( b ) )
¿Cuál es la mejora que le gustaría ver?
Una nueva función subst() que no evalúa sus argumentos. Entonces se puede escribir:
Substitute( a + Sqrt( a ), a, b )
¿Por qué es importante esta idea?
Subst() y Eval(Subst()) se utilizarán millones de veces, ¡y cada vez un programador de JSL estará feliz de que lo hayas implementado!
Otros deseos de 
Automatización y scriptingRe: subst() - sustituto() 2.0En la mayoría de los casos, el usuario proporcionará al menos uno de los argumentos como nombre, con la idea de que JMP busque el nombre y utilice Name Expr en lugar del nombre en sí.
Por lo tanto, JMP debe evaluar los argumentos a un nivel (busque, tome Name Expr si está disponible, no evalúe más) donde sea posible escribir:
a=Expr(myExpr);
Subst(x+y, x, a) // result: myExpr + y
</CODE>instead of </P><PRE><CODE class=" language-jsl">a=Expr(myExpr);
Substitute(Expr(x+y), Expr(x), Name Expr(a)) // result: myExpr + y
.
Y si un usuario quiere estar seguro de que JMP usa el argumento tal como está (sin resolver Name Expr .), puede escribir:
a=Expr(myExpr);
Subst(x+y, x, Expr(a)) // result: a + y
Re: subst() - sustituto() 2.0Con otras palabras:
sust()
... un Substitute() con la magia/facilidad de Extract Expr()
clear symbols();
// direct mode, no Expr necessary
Extract Expr(x + y, x);// -> x
Extract Expr(x^2 + y, c);// no c in x^2 + y -> empty
// Name Expr mode
c=Expr(x^2);
Extract Expr(x^2 + y , c);// looks up c = x^2, find "x^2"" in x^2 +y
desafortunadamente, lo que no funciona (tan fácil como deseaba):
c=Expr(x^2);
Extract Expr(c * d, Expr(c))
Extraer Expr
Re: subst() - replaced() 2.0 - Estado cambiado a: ConfirmadoGracias por la sugerencia @hogi .