Sostituire Head() ?Nella breakout room Scripting del Discovery Summit 2024 abbiamo appena discusso se esista una funzione JSL per sostituire la testa di un'espressione.
Qualcosa come
Replace Head(myExpression, <STRIKE>Expr(original head()),</STRIKE> Expr(new head()));
modifica: Expr(head() originale)
...per convertire
original head(args)
in
new head(args)
In questo contesto, si potrebbe pensare a Substitute. Oltre a sostituire le stringhe
Substitute ("hello", "h", "J", "l", "f", "o", "")si può usare Substitute anche per sostituire Expressions, come in
Substitute({1+2},Expr(add()),Expr(subtract()))
Si avvicina, ma è ben lungi dall'essere ottimale, ad esempio
Substitute({1,2,{3,4}}, Expr(List()),Expr(Show()));restituirà Mostra( 1, 2, Mostra( 3, 4 ) )
: (
Una possibile soluzione: convertire l'espressione in una stringa e utilizzare Regex, quindi riconvertirla.
fa male quando conosci la magia della gestione delle espressioni : )
La soluzione migliore finora è tramite la gestione delle espressioni:
Invece di sostituire la testa, estrai tutti gli argomenti e inseriscili nella nuova testa.
var = {1,2,{3,4}};
MyExpr = Expr(Show());
for(i=1, i<=NArg(var), i++,
InsertInto(MyExpr, Arg(var, i))
);
NameExpr(MyExpr);

Automazione e scriptingRi: Sostituire Head() ?Se non hai liste è un po' più semplice sostituire solo la testa. Con le liste diventa più complicato e opterei per l'opzione di ricostruire semplicemente l'espressione.
Stavo scrivendo una richiesta di lista dei desideri ispirata da str.replace di Python quando mi sono imbattuta in questa voce Substitute First Occurrence . La sostituzione solo della prima occorrenza è già stata suggerita e coprirebbe i conteggi di occorrenze più "necessari" (1 e tutti).
Ri: Sostituire Head() ?Ok, grazie.
convertToList=
Function( {myExpr},{myList,i},
myList = {};
For( i = 1, i <= N Arg( Name Expr( myExpr ) ), i++,
Insert Into( myList, Arg( Name Expr( myExpr ), i ) )
);
Return( Name Expr( myList ) );
),
modificare:
[Ho appena trovato "i" nel mio namespace HERE - non me l'aspettavo:
La maggior parte delle volte li utilizzo entrambi .
--> " i " aggiunto come variabile locale della funzione
modifica2:
non usare questo codice!!! può portare a risultati errati: stranezza di JMP Expr(), qualcuno può spiegarlo?
-> usa la soluzione di @jthi qui sotto!
Vedi altro...convertToList = Function( {myExpr},
{tmp},
tmp = Name Expr( myExpr );
Remove From( tmp, 1, N Arg( tmp ) );
) Ri: Sostituire Head() ?Esistono tutti i tipi di opzioni (buone, cattive, facili da capire, difficili da capire e tutto ciò che sta nel mezzo e che è misto).
Questi modificheranno le espressioni originali, quindi copie delle espressioni (myexpr1_copy = Name Expr(myexpr1); ad esempio) dovrebbero essere utilizzate se ciò non è desiderato
Names Default To Here(1);
// Replace outmost Max with Min
myexpr1 = Expr(Max(1, Max(1,2)));
args = Remove From(myexpr1, 1, N Arg(myexpr1));
myexpr_new = Substitute(args, Head(List()), Expr(Min()));
Show(myexpr_new);
// Change outmost List into Max
myexpr2 = {1, {1,2}};
var = Head(myexpr);
Substitute Into(var, Expr(List()), Expr(Show()));
While(N Items(arg = Remove From(myexpr2, 1)), Insert Into(var, arg[1]));
show(var);
// "Change" outmost Max into list
myexpr3 = Expr(Max(1, Max(1,2)));
mylist = Remove From(myexpr3, 1, N Arg(myexpr3));
Show(mylist);Ri: Sostituire Head() ?Wow, davvero intelligente!
guarda nel cestino di Remove From()
Freddo!
Ri: Sostituire Head() ?Ho appena trovato un'altra soluzione: si basa sui superpoteri di For Each : )

myexpr1 = Expr(Max(1, Max(1,2)));
myexpr_new = Expr (min());
For each({arg},Name Expr(myExpr1),
Insert Into(myexpr_new, Name Expr(arg))
);
show(myexpr_new )
Ri: Sostituire Head() ?Sono felice di annunciare - un Replace Head() abbastanza universale:
Add Custom Functions(
New Custom Function(
"hogi",
"replace head",
Function( {orig, new Head},
{Default Local},
mydummy = Expr( dummy() );
For Each( {arg}, Name Expr( orig ), Insert Into( mydummy, arg ) );
x = Substitute( Name Expr( mydummy ), Expr( dummy() ), Name Expr( new Head ) );
//Eval(Substitute(Expr(Print(Expr(_x_))), Expr(_x_), Name Expr(x)));
Eval(Substitute(Expr(return(Expr(Expr(_x_)))), Expr(_x_), Name Expr(x))); // *)
),
<< description("takes the first argument and replaces its head with the second argument"),
<< example(Expr(
hogi:replace head({1,2,{3,4}}, Expr(Show()));
orig = Expr(Max(1,2,3));
hogi:replace head(Name Expr(orig), Expr(Show()));
))
)
);aggiunto alle funzioni personalizzate utili
*) come in
https://community.jmp.com/t5/JMP-Wish-List/Substitute-First-Occurrence/idc-p/825822/highlight/true#M6863
ma + 1x Expr() - a causa della funzione personalizzata?!?
Ri: Sostituire Head() ?@jthi ha appena menzionato Transfrom Each + Output
https://community.jmp.com/t5/Discussions/Slicing-Associative-Arrays/mp/828081/highlight/true#M100979
Esiste un'opzione per sostituire la testina:

che funziona così:
ex = Transform Each( {value},{10, 20, 30}, Output( "Expression", "My Values" ), value + 1);e funziona anche per le espressioni : )
myexpr = Expr(Max(1, Max(1,2)));
Transform Each({entry},Name Expr(myExpr), Output( "Expression", "List"),Name Expr(entry))
Ri: Sostituire Head() ?Ciò riduce la funzione a:
Add Custom Functions(
New Custom Function(
"hogi",
"replace head",
Function( {orig, new Head},
{Default Local},
Transform Each( {arg}, Name Expr( orig ), Output("Expression", new Head), Name expr(arg ) );
),
<< description("takes the first argument and replaces its head with the second argument - secnd argument: String!!"),
<< example(Expr(
hogi:replace head({1,2,{3,4}}, "Show");
orig = myexpr = Expr(Max(1, Max(1,2)));
hogi:replace head(Name Expr(orig), "List");
))
)
); Si prega di notare che la nuova Head deve essere fornita come Stringa, non come espressione!