Rareza de JMP Expr(), ¿alguien puede explicarlo?Esto es principalmente solo una publicación de frustración por la siguiente inconsistencia al insertar expresiones 'IF' en una expresión 'IF'.Tengo entendido que los lenguajes de programación no deberían ser más que consistentes (y soy consciente de muchas otras inconsistencias de JMP, solo que esta no tiene ningún sentido para mí).
/*
What I want is to generate an expression such as the one below programmatically. There of course is a straight-forward work around, I just don't like dealing with special cases especially when they make no sense.
Expr( If( a, If( b, c) ) )<BR />
*/
expr = Expr( If( a ) );
Insert Into( expr, Expr( If( b, c ) ) );
Show( Name Expr( expr ) );
/*
If( a, b, c)
*/
expr = Expr( not an If( a ) );
Insert Into( expr, Expr( If( b, c ) ) );
Show( Name Expr( expr ) );
/*
not an If( a, If( b, c) )
*/
Si alguien tiene alguna idea, o especialmente si conoce una manera de insertar de manera confiable cualquier expresión en cualquier otra expresión (sin usar 'Eval Insert' o cadenas), ¡sería genial!¡Gracias!
Modelado estadístico avanzadoRe: Rareza de JMP Expr(), ¿alguien puede explicarlo?existe una solución alternativa para realizar la tarea solicitada, pero la pregunta real: ¿¡¿POR QUÉ?!? aún no ha sido respondida.
añadido a Pequeñas trampas en Jmp y JSL
Re: Rareza de JMP Expr(), ¿alguien puede explicarlo?Otros ejemplos que refutan fácilmente algunas de las hipótesis y añaden más ideas:
expr = Expr( If( a, x ) );
Insert Into( expr, Expr(If( b,c )) );
Show( Name Expr( expr ) ); // if(a,x,b,c)
expr = Expr( If( a ) );
Insert Into( expr, Expr(If( b )) );
Show( Name Expr( expr ) ); // if(a,b)
expr = Expr( List( a ) );
Insert Into( expr, Expr(List( b )) );
Show( Name Expr( expr ) ); // List(a,b)
expr = Expr( Graph Builder( a ) );
Insert Into( expr, Expr(Graph Builder ( b )) );
Show( Name Expr( expr ) ); // Graph Builder(a,b)
expr = Expr( Head( a ) );
Insert Into( expr, Expr(Head( b )) );
Show( Name Expr( expr ) ); // Head(a,b) (!)
expr = Expr( Not( a ) );
Insert Into( expr, Expr(Not( b )) );
Show( Name Expr( expr ) ); // Not(a) (!!)
Re: Rareza de JMP Expr(), ¿alguien puede explicarlo?Hola,
Aunque no estoy seguro, me pregunto si este comportamiento se debe a que el fragmento "IF (a)" no es una expresión JSL bien formada. Es decir, la función SI toma 2 argumentos, no uno. JMP no tiene forma de saber si "notAnIf(a)" es una expresión bien formada, por lo que tal vez se encoge de hombros y continúa (?). Total suposición de mi parte.
El hecho de que lo siguiente funcione como usted pretende parece agregar algo de apoyo a esta idea, pero esto no explica por qué @ben_ph La idea funciona, ya que inserta con éxito REPLACE_ME donde me falta.
expr = Expr( If( a, . ) );
Substitute Into( expr, expr(.), expr( If( b, c ) ) );
Show( Name Expr( expr ) );

Salud,
Brady
Re: Rareza de JMP Expr(), ¿alguien puede explicarlo?Como solución alternativa sin usar cadenas, podrías hacer algo como
expr = Expr( If( a ) );
Insert Into( expr, Expr( REPLACE_ME ) );
Substitute Into( expr, Expr( REPLACE_ME ), Expr( If( b, c ) ) );
Name Expr( expr );
// If( a, If( b, c ) )
Re: Rareza de JMP Expr(), ¿alguien puede explicarlo?Esto es relacionado cercanamente a lo mismo que Cómo insertar una lista en otra lista . Con su pregunta, ahora sospecho que hay una excepción especial para los nombres de funciones integradas que muestra este comportamiento.
expr = Expr( not an If( a ) );
es lo mismo que
expr = Expr( NotAnIf( a ) );
hacer que NotAnIf (o no un if) sea un nombre de función que JMP no reconoce como incorporado. En el ejemplo de { list }, {...} es lo mismo que List(...) y es un nombre de función incorporada.
expr = Expr( suma( a ) );
Insertar en( expr, Expr( suma( b, c ) ) );
Mostrar( Nombre Expr( expr ) );
/*:
Nombre Expr(expr) = Suma(a, b, c);
//:*/
expr = Expr( suma1( a ) );
Insertar en( expr, Expr( suma1( b, c ) ) );
Mostrar( Nombre Expr( expr ) );
/*:
Nombre Expr(expr) = suma1(a, suma1(b, c));
A mí tampoco me gusta.
@XanGregg