Head()를 바꾸시겠습니까?Discovery Summit 2024의 스크립팅 브레이크아웃 룸에서 우리는 표현식의 헤드를 대체할 수 있는 JSL 함수가 있는지에 대해 논의했습니다.
뭔가 같은 것
Replace Head(myExpression, <STRIKE>Expr(original head()),</STRIKE> Expr(new head()));
편집: Expr(원래 head())
... 변환하다
original head(args)
~ 안으로
new head(args)
이 맥락에서 Substitute를 생각해 볼 수 있습니다. 문자열을 대체하는 것 외에도
Substitute ("hello", "h", "J", "l", "f", "o", "")Substitute를 사용하여 표현식을 대체할 수도 있습니다.
Substitute({1+2},Expr(add()),Expr(subtract()))
거의 비슷하지만 최적과는 거리가 멉니다. 예를 들어
Substitute({1,2,{3,4}}, Expr(List()),Expr(Show()));Show( 1, 2, Show( 3, 4 ) )를 반환합니다.
: (
가능한 해결책: 표현식을 문자열로 변환하고 정규식을 사용한 후 다시 변환합니다.
표현 처리의 마법을 알면 이게 아프죠 : )
지금까지 가장 좋은 솔루션은 표현 처리를 통한 것입니다.
헤드를 바꾸는 대신, 모든 인수를 추출해 새로운 헤드에 삽입합니다.
var = {1,2,{3,4}};
MyExpr = Expr(Show());
for(i=1, i<=NArg(var), i++,
InsertInto(MyExpr, Arg(var, i))
);
NameExpr(MyExpr);

자동화 및 스크립팅Re: Head()를 바꾸시겠습니까?리스트가 없다면 머리만 바꾸는 게 좀 더 쉽습니다. 리스트를 사용하면 더 복잡해지고 표현식을 다시 작성하는 옵션을 선택할 것입니다.
저는 Python의 str.replace에서 영감을 받아 소원 목록 요청을 작성하던 중 Substitute First Occurrence 라는 항목을 발견했습니다. 첫 번째 발생만 대체하는 것이 이미 제안되었으며 가장 "필요한" 발생 횟수(1 및 전체)를 포함할 것입니다.
Re: Head()를 바꾸시겠습니까?알겠습니다. 고맙습니다.
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 ) );
),
편집하다:
[방금 HERE 네임스페이스에서 "i"를 발견했습니다. 예상치 못한 일이었습니다.
저는 대부분 각각에 대해 이를 사용합니다.
--> 함수의 로컬 변수로 " i "가 추가되었습니다.
편집2:
이 코드를 사용하지 마세요!!!잘못된 결과가 발생할 수 있습니다: JMP Expr()이 이상하게 동작하는데, 누가 설명해 줄 수 있나요?
-> 아래 @jthi 의 솔루션을 사용하세요!
더 보기...convertToList = Function( {myExpr},
{tmp},
tmp = Name Expr( myExpr );
Remove From( tmp, 1, N Arg( tmp ) );
) Re: Head()를 바꾸시겠습니까?다양한 옵션이 있습니다(좋은 것, 나쁜 것, 이해하기 쉬운 것, 이해하기 어려운 것, 그 중간과 혼합된 것).
이렇게 하면 원래 표현식이 수정되므로 원하지 않는 경우 표현식 사본(예: myexpr1_copy = Name Expr(myexpr1);)을 사용해야 합니다.
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: Head()를 바꾸시겠습니까?와, 정말 똑똑하네요!
Remove From() 의 휴지통을 살펴보세요
시원한!
Re: Head()를 바꾸시겠습니까?방금 또 다른 해결책을 찾았어요. 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: Head()를 바꾸시겠습니까?Replace Head() 라는 매우 보편적인 기능을 발표하게 되어 기쁩니다.
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()));
))
)
);유용한 사용자 정의 기능 에 추가됨
*) 처럼
https://community.jmp.com/t5/JMP-Wish-List/Substitute-First-Occurrence/idc-p/825822/highlight/true#M6863
하지만 + 1x Expr() - 사용자 정의 함수로 인해 ?!?
Re: Head()를 바꾸시겠습니까?이렇게 하면 기능이 다음과 같이 축소됩니다.
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");
))
)
); 새로운 Head는 표현식이 아닌 문자열로 제공되어야 한다는 점에 유의하세요!
Re: Head()를 바꾸시겠습니까?@jthi 방금 Transfrom Each + Output을 언급했습니다.
https://community.jmp.com/t5/Discussions/Slicing-Associative-Arrays/mp/828081/highlight/true#M100979
헤드를 교체하는 옵션이 있습니다.

작동 방식은 다음과 같습니다.
ex = Transform Each( {value},{10, 20, 30}, Output( "Expression", "My Values" ), value + 1);그리고 표현에도 적용이 됩니다 : )
myexpr = Expr(Max(1, Max(1,2)));
Transform Each({entry},Name Expr(myExpr), Output( "Expression", "List"),Name Expr(entry))