¿Reemplazar Head()?En la sala de trabajo sobre scripts de Discovery Summit 2024, acabamos de analizar si existe una función JSL para reemplazar el encabezado de una expresión.
Algo como
Replace Head(myExpression, <STRIKE>Expr(original head()),</STRIKE> Expr(new head()));
editar: Expr(cabeza original())
...convertir
original head(args)
en
new head(args)
En este contexto, se podría pensar en Substitute. Además de reemplazar cadenas
Substitute ("hello", "h", "J", "l", "f", "o", "")También se puede usar Substitute para reemplazar expresiones, como en
Substitute({1+2},Expr(add()),Expr(subtract()))
Se acerca, pero está lejos de ser óptimo, por ejemplo
Substitute({1,2,{3,4}}, Expr(List()),Expr(Show()));devolverá Mostrar( 1, 2, Mostrar( 3, 4 ) )

Una posible solución: convertir la expresión en una cadena y usar Regex, luego volver a convertir.
Esto duele cuando conoces la magia del manejo de expresiones 
La mejor solución hasta ahora - a través del manejo de expresiones:
En lugar de reemplazar el encabezado, extraiga todos los argumentos e insértelos en el nuevo encabezado.
var = {1,2,{3,4}};
MyExpr = Expr(Show());
for(i=1, i<=NArg(var), i++,
InsertInto(MyExpr, Arg(var, i))
);
NameExpr(MyExpr);

Automatización y scriptingRe: ¿Reemplazar Head()?Si no tienes listas, es un poco más fácil reemplazar solo el encabezado. Con las listas, la cosa se complica y yo optaría por la opción de simplemente reconstruir la expresión.
Estaba escribiendo una solicitud de lista de deseos inspirada en str.replace de Python cuando me encontré con este elemento Sustituir la primera ocurrencia . Ya se ha sugerido sustituir solo la primera ocurrencia y cubriría la cantidad de ocurrencias más "necesarias" (1 y todas).
Re: ¿Reemplazar Head()?Bueno, gracias.
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 ) );
),
editar:
Acabo de encontrar "i" en mi espacio de nombres AQUÍ; no esperaba eso:
Yo uso "for each" la mayor parte del tiempo.
--> " i " añadido como variable local de la función
edición2:
¡¡¡No uses este código!!! Puede llevar a resultados erróneos: rareza de JMP Expr(), ¿alguien puede explicarlo?
-> ¡Utilice la solución de @jthi a continuación!
Ver más...convertToList = Function( {myExpr},
{tmp},
tmp = Name Expr( myExpr );
Remove From( tmp, 1, N Arg( tmp ) );
) Re: ¿Reemplazar Head()?Hay todo tipo de opciones (buenas, malas, fáciles de entender, difíciles de entender y todo lo que hay entre medio y mixto).
Estos modificarán las expresiones originales, por lo que se deben usar copias de las expresiones (myexpr1_copy = Name Expr(myexpr1); por ejemplo) si eso no se desea.
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: ¿Reemplazar Head()?Vaya, ¡esto es muy inteligente!
Mire en la papelera de reciclaje de Remove From()
¡Frío!
Re: ¿Reemplazar Head()?Acabo de encontrar otra solución: se basa en los superpoderes 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: ¿Reemplazar Head()?Me complace anunciar: un reemplazo de cabezal () bastante universal:
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()));
))
)
);Se agregó a las funciones personalizadas útiles
*) como en
https://community.jmp.com/t5/JMP-Wish-List/Substitute-First-Occurrence/idc-p/825822/highlight/true#M6863
pero + 1x Expr() - ¿debido a la función personalizada?
Re: ¿Reemplazar Head()?Esto reduce la función 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");
))
)
); Tenga en cuenta que el nuevo encabezado debe proporcionarse como una cadena, no como una expresión.
Re: ¿Reemplazar Head()?@jthi acaba de mencionar Transfrom Each + Output
https://community.jmp.com/t5/Discussions/Slicing-Associative-Arrays/mp/828081/highlight/true#M100979
Existe una opción para reemplazar el cabezal:

que funciona así:
ex = Transform Each( {value},{10, 20, 30}, Output( "Expression", "My Values" ), value + 1);y también funciona para expresiones : )
myexpr = Expr(Max(1, Max(1,2)));
Transform Each({entry},Name Expr(myExpr), Output( "Expression", "List"),Name Expr(entry))