Head() ersetzen?Im Scripting-Breakout-Room des Discovery Summit 2024 haben wir gerade diskutiert, ob es eine JSL-Funktion gibt, um den Kopf eines Ausdrucks zu ersetzen.
So etwas wie
Replace Head(myExpression, <STRIKE>Expr(original head()),</STRIKE> Expr(new head()));
bearbeiten: Ausdruck(ursprünglicher Kopf())
... konvertieren
original head(args)
hinein
new head(args)
In diesem Zusammenhang könnte man an Substitute denken. Neben dem Ersetzen von Strings
Substitute ("hello", "h", "J", "l", "f", "o", "")Man kann Substitute auch verwenden, um Ausdrücke zu ersetzen, wie in
Substitute({1+2},Expr(add()),Expr(subtract()))
Es kommt nahe heran, ist aber weit vom Optimum entfernt, z. B.
Substitute({1,2,{3,4}}, Expr(List()),Expr(Show()));gibt Show( 1, 2, Show( 3, 4 ) ) zurück.
: (
Eine mögliche Lösung: Konvertieren Sie den Ausdruck in eine Zeichenfolge, verwenden Sie Regex und konvertieren Sie anschließend zurück.
das tut weh, wenn man die Magie der Ausdrucksbehandlung kennt : )
Die bisher beste Lösung - über die Ausdrucksbehandlung:
Anstatt den Kopf zu ersetzen, extrahieren Sie alle Argumente und fügen Sie sie in den neuen Kopf ein.
var = {1,2,{3,4}};
MyExpr = Expr(Show());
for(i=1, i<=NArg(var), i++,
InsertInto(MyExpr, Arg(var, i))
);
NameExpr(MyExpr);

Automatisierung und SkriptingBetreff: Head() ersetzen?Wenn Sie keine Listen haben, ist es etwas einfacher, nur den Kopf zu ersetzen. Mit Listen wird es komplizierter und ich würde die Option wählen, nur den Ausdruck neu zu erstellen.
Ich habe eine Wunschlistenanfrage geschrieben, die von Pythons str.replace inspiriert war, als ich auf diesen Eintrag „Ersetzen des ersten Vorkommens “ stieß. Das Ersetzen nur des ersten Vorkommens wurde bereits vorgeschlagen und würde die am meisten „erforderlichen“ Vorkommenszahlen (1 und alle) abdecken.
Betreff: Head() ersetzen?Ok, danke.
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 ) );
),
bearbeiten:
[Ich habe gerade „i“ in meinem HERE-Namespace gefunden – damit hatte ich nicht gerechnet:
Ich verwende es meistens für beides .
--> " i " als lokale Variable der Funktion hinzugefügt
Bearbeitung2:
verwenden Sie diesen Code nicht!!! Kann zu falschen Ergebnissen führen: JMP Expr()-Merkwürdigkeit, kann das jemand erklären?
-> verwenden Sie die unten stehende Lösung von @jthi !
Mehr anzeigen...convertToList = Function( {myExpr},
{tmp},
tmp = Name Expr( myExpr );
Remove From( tmp, 1, N Arg( tmp ) );
) Betreff: Head() ersetzen?Es gibt alle möglichen Optionen (gut, schlecht, leicht verständlich, schwer verständlich und alles dazwischen und gemischt).
Diese ändern die ursprünglichen Ausdrücke, daher sollten Kopien der Ausdrücke (myexpr1_copy = Name Expr(myexpr1); zum Beispiel) verwendet werden, wenn dies nicht gewünscht ist.
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);Betreff: Head() ersetzen?wow, das ist sehr clever!
Schauen Sie in den Papierkorb von Remove From()
Cool!
Betreff: Head() ersetzen?Ich habe gerade eine andere Lösung gefunden – sie basiert auf den Superkräften von 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 )
Betreff: Head() ersetzen?Ich freue mich, ein ziemlich universelles Replace Head() ankündigen zu können:
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()));
))
)
);zu hilfreichen benutzerdefinierten Funktionen hinzugefügt
*) wie in
https://community.jmp.com/t5/JMP-Wish-List/Substitute-First-Occurrence/idc-p/825822/highlight/true#M6863
aber + 1x Expr() – aufgrund der benutzerdefinierten Funktion?!?
Betreff: Head() ersetzen?@jthi hat gerade „Transfrom Each + Output“ erwähnt.
https://community.jmp.com/t5/Discussions/Slicing-Associative-Arrays/mp/828081/highlight/true#M100979
Es besteht die Möglichkeit den Kopf auszutauschen:

das funktioniert so:
ex = Transform Each( {value},{10, 20, 30}, Output( "Expression", "My Values" ), value + 1);und es funktioniert auch für Ausdrücke : )
myexpr = Expr(Max(1, Max(1,2)));
Transform Each({entry},Name Expr(myExpr), Output( "Expression", "List"),Name Expr(entry))
Betreff: Head() ersetzen?Dies reduziert die Funktion auf:
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");
))
)
); Bitte beachten Sie, dass der neue Header als String und nicht als Ausdruck angegeben werden muss!