Stranezza di JMP Expr(), qualcuno può spiegare?Questo è principalmente solo un post di frustrazione per la seguente incoerenza con l'inserimento delle espressioni "IF" in un'espressione "IF".Mi risulta che i linguaggi di programmazione non dovrebbero essere altro che coerenti (e sono a conoscenza di molte altre incoerenze di JMP: è solo che questa non ha alcun senso per me).
/*
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) )
*/
Se qualcuno ha qualche intuizione, o soprattutto se conosci un modo per inserire in modo affidabile qualsiasi espressione in qualsiasi altra espressione (non utilizzando "Eval Insert" o stringhe), sarebbe fantastico!Grazie!
Modellazione statistica avanzataRi: Stranezza di JMP Expr(), qualcuno può spiegare?esiste una soluzione alternativa per eseguire l'attività richiesta, ma la domanda reale: PERCHÉ?!? non è ancora stata data risposta.
aggiunto a Piccole trappole in Jmp e JSL
Ri: Stranezza di JMP Expr(), qualcuno può spiegare?Ulteriori esempi che smentiscono facilmente alcune ipotesi e aggiungono ulteriori approfondimenti:
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) (!!)
Ri: Stranezza di JMP Expr(), qualcuno può spiegare?Ciao,
Anche se non ne sono sicuro, mi chiedo se questo comportamento sia dovuto al fatto che lo snippet "IF (a)" non è un'espressione JSL ben formata. Cioè, la funzione SE accetta 2 argomenti, non uno. JMP non ha modo di sapere se "notAnIf( a )" è un'espressione ben formata, quindi forse alza le spalle e procede ( ? ) Ipotesi totale da parte mia.
Il fatto che quanto segue funzioni come intendi sembra aggiungere un po' di supporto a questa idea, ma questo non spiega il perché @ben_ph funziona, poiché inserisce con successo REPLACE_ME dove manca un file.
expr = Expr( If( a, . ) );
Substitute Into( expr, expr(.), expr( If( b, c ) ) );
Show( Name Expr( expr ) );

Saluti,
Brady
Ri: Stranezza di JMP Expr(), qualcuno può spiegare?Come soluzione alternativa senza utilizzare le stringhe potresti fare qualcosa di simile
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 ) )
Ri: Stranezza di JMP Expr(), qualcuno può spiegare?Questo è strettamente correlato a lo stesso di Come inserire una lista in un'altra lista . Con la tua domanda, ora sospetto che esista un'eccezione speciale per i nomi delle funzioni integrate che mostra questo comportamento.
expr = Expr( not an If( a ) );
equivale a
expr = Expr( NotAnIf( a ) );
facendo in modo che NotAnIf (o non un if) sia un nome di funzione che JMP non riconosce come incorporato. Nell'esempio { list }, {...} è uguale a List(...) e È un nome di funzione incorporata.
espressione = Espr( somma( a ) );
Inserisci in( espressione, Espr( somma( b, c ) ) );
Mostra (Nome Espr (espr));
/*:
Nome Espr(espr) = Somma(a, b, c);
//:*/
espressione = Espr( somma1( a ) );
Inserisci in (espr, Espr( somma1( b, c ) ) );
Mostra (Nome Espr (espr));
/*:
Nome Espr(espr) = somma1(a, somma1(b, c));
Non piace neanche a me.
@XanGregg