Remplacer la tête() ?Dans la salle de discussion sur les scripts du Discovery Summit 2024, nous venons de discuter de l'existence d'une fonction JSL pour remplacer la tête d'une expression.
Quelque chose comme
Replace Head(myExpression, <STRIKE>Expr(original head()),</STRIKE> Expr(new head()));
modifier : Expr(tête d'origine())
... pour convertir
original head(args)
dans
new head(args)
Dans ce contexte, on pourrait penser à Substitute. En plus de remplacer les chaînes
Substitute ("hello", "h", "J", "l", "f", "o", "")on peut également utiliser Substitute pour remplacer des expressions, comme dans
Substitute({1+2},Expr(add()),Expr(subtract()))
On s'en rapproche, mais on est loin d'être optimal, par exemple
Substitute({1,2,{3,4}}, Expr(List()),Expr(Show()));renverra Show( 1, 2, Show( 3, 4 ) )
: (
Une solution possible : convertir l'expression en chaîne et utiliser Regex, puis reconvertir.
ça fait mal quand on connait la magie de la gestion des expressions 
La meilleure solution jusqu'à présent - via la gestion des expressions :
Au lieu de remplacer la tête, extrayez tous les arguments et insérez-les dans la nouvelle tête.
var = {1,2,{3,4}};
MyExpr = Expr(Show());
for(i=1, i<=NArg(var), i++,
InsertInto(MyExpr, Arg(var, i))
);
NameExpr(MyExpr);

Automatisation et scriptsRe: Remplacer Head() ?Si vous n'avez pas de listes, il est un peu plus simple de remplacer uniquement la tête. Avec les listes, cela devient plus compliqué et je choisirais l'option consistant simplement à reconstruire l'expression.
J'étais en train d'écrire une demande de liste de souhaits inspirée par str.replace de Python lorsque je suis tombé sur cet élément Substitute First Occurrence . La substitution de la première occurrence seulement a déjà été suggérée et elle couvrirait les nombres d'occurrences les plus « nécessaires » (1 et tous).
Re: Remplacer Head() ?D'accord merci.
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 ) );
),
modifier:
[Je viens de trouver « i » dans mon espace de noms HERE – je ne m'attendais pas à ça :
Je l'utilise pour chacun la plupart du temps.
--> " i " ajouté comme variable locale de la fonction
edit2:
n'utilisez pas ce code !!! peut conduire à des résultats erronés : bizarrerie JMP Expr(), quelqu'un peut-il expliquer ?
-> utilisez la solution de @jthi ci-dessous !
Voir plus...convertToList = Function( {myExpr},
{tmp},
tmp = Name Expr( myExpr );
Remove From( tmp, 1, N Arg( tmp ) );
) Re: Remplacer Head() ?Il existe toutes sortes d'options (bonnes, mauvaises, faciles à comprendre, difficiles à comprendre et tout ce qui se trouve entre les deux et mélangées).
Ceux-ci modifieront les expressions originales, donc des copies des expressions (myexpr1_copy = Name Expr(myexpr1); par exemple) doivent être utilisées si cela n'est pas souhaité
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);Re: Remplacer Head() ?wow, c'est très intelligent !
regarde dans la corbeille de Remove From()
cool!
Re: Remplacer Head() ?Je viens de trouver une autre solution - elle est basée sur les super pouvoirs de 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 )
Re: Remplacer Head() ?Je suis heureux d'annoncer - un Replace Head() assez universel :
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()));
))
)
);ajouté aux fonctions personnalisées utiles
*) comme dans
https://community.jmp.com/t5/JMP-Wish-List/Substitute-First-Occurrence/idc-p/825822/highlight/true#M6863
mais + 1x Expr() - à cause de la fonction personnalisée ?!?
Re: Remplacer Head() ?@jthi vient de mentionner Transfrom Each + Output
https://community.jmp.com/t5/Discussions/Slicing-Associative-Arrays/mp/828081/highlight/true#M100979
Il existe une option pour remplacer la tête :

qui fonctionne comme ceci :
ex = Transform Each( {value},{10, 20, 30}, Output( "Expression", "My Values" ), value + 1);et ça marche aussi pour les expressions : )
myexpr = Expr(Max(1, Max(1,2)));
Transform Each({entry},Name Expr(myExpr), Output( "Expression", "List"),Name Expr(entry))
Re: Remplacer Head() ?Cela réduit la fonction à :
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");
))
)
); Veuillez noter que la nouvelle tête doit être fournie sous forme de chaîne et non sous forme d'expression !