JMP Expr()의 이상한 점을 설명할 수 있는 사람이 있나요?이것은 대부분 'IF' 표현식에 'IF' 표현식을 삽입할 때 발생하는 다음과 같은 불일치에 대한 불만스러운 게시물입니다.프로그래밍 언어는 일관성이 없으면 아무 의미가 없다는 것이 내 생각입니다. 그리고 저는 JMP의 다른 많은 불일치도 알고 있습니다. 단지 이 불일치가 제게는 전혀 이해가 되지 않는다는 것뿐입니다.
/*
What I want is to generate an expression such as the one below programmatically. There of course is a straight-forward work around, I just don't like dealing with special cases especially when they make no sense.
Expr( If( a, If( b, c) ) )<BR />
*/
expr = Expr( If( a ) );
Insert Into( expr, Expr( If( b, c ) ) );
Show( Name Expr( expr ) );
/*
If( a, b, c)
*/
expr = Expr( not an If( a ) );
Insert Into( expr, Expr( If( b, c ) ) );
Show( Name Expr( expr ) );
/*
not an If( a, If( b, c) )
*/
통찰력이 있는 사람이 있거나 특히 '평가 삽입'이나 문자열을 사용하지 않고 다른 표현식에 표현식을 안정적으로 삽입하는 방법을 알고 있다면 정말 좋을 것입니다!감사해요!
고급 통계 모델링Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?요청한 작업을 수행하기 위한 해결 방법이 있지만 실제 질문은 다음과 같습니다. 왜?!? 아직 답변이 없습니다.
에 추가됨 Jmp와 JSL의 작은 함정
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?일부 가설을 쉽게 반증하고 추가 통찰력을 추가하는 추가 예:
expr = Expr( If( a, x ) );
Insert Into( expr, Expr(If( b,c )) );
Show( Name Expr( expr ) ); // if(a,x,b,c)
expr = Expr( If( a ) );
Insert Into( expr, Expr(If( b )) );
Show( Name Expr( expr ) ); // if(a,b)
expr = Expr( List( a ) );
Insert Into( expr, Expr(List( b )) );
Show( Name Expr( expr ) ); // List(a,b)
expr = Expr( Graph Builder( a ) );
Insert Into( expr, Expr(Graph Builder ( b )) );
Show( Name Expr( expr ) ); // Graph Builder(a,b)
expr = Expr( Head( a ) );
Insert Into( expr, Expr(Head( b )) );
Show( Name Expr( expr ) ); // Head(a,b) (!)
expr = Expr( Not( a ) );
Insert Into( expr, Expr(Not( b )) );
Show( Name Expr( expr ) ); // Not(a) (!!)
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?안녕하세요,
확실하지는 않지만, 이 동작은 "IF ( a )" 조각이 올바른 형식의 JSL 표현식이 아니기 때문인지 궁금합니다. 즉, 함수 IF는 하나가 아닌 2개의 인수를 취합니다. JMP는 "notAnIf( a )"가 올바른 표현인지 알 방법이 없으므로 아마도 어깨를 으쓱하고 ( ? ) 전체 추측을 진행합니다.
다음이 의도한 대로 작동한다는 사실은 이 아이디어에 일부 지원을 추가하는 것처럼 보이지만 이것이 이유를 설명하지는 않습니다. @ben_ph 누락된 부분에 REPLACE_ME를 성공적으로 삽입했기 때문에 님의 아이디어가 효과가 있습니다.
expr = Expr( If( a, . ) );
Substitute Into( expr, expr(.), expr( If( b, c ) ) );
Show( Name Expr( expr ) );

건배,
브래디
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?문자열을 사용하지 않는 해결 방법으로 다음과 같은 작업을 수행할 수 있습니다.
expr = Expr( If( a ) );
Insert Into( expr, Expr( REPLACE_ME ) );
Substitute Into( expr, Expr( REPLACE_ME ), Expr( If( b, c ) ) );
Name Expr( expr );
// If( a, If( b, c ) )
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?이것은 밀접하게 관련되어 있다 같은 목록을 다른 목록에 삽입하는 방법 . 귀하의 질문으로 인해 이제 이러한 동작을 보여주는 내장 함수 이름에 대한 특별한 예외가 있는 것으로 의심됩니다.
expr = Expr( not an If( a ) );
와 같다
expr = Expr( NotAnIf( a ) );
NotAnIf(또는 if가 아닌)를 함수 이름으로 만들기 JMP는 내장된 것으로 인식하지 않습니다. { list } 예에서 {...}는 List(...)와 동일하며 ~이다 내장 함수 이름.
expr = Expr( sum( a ) );
Insert Into( expr, Expr( sum( b, c ) ) );
표시( 이름 Expr( expr ) );
/*:
이름 Expr(expr) = Sum(a, b, c);
//:*/
expr = Expr( sum1( a ) );
Insert Into( expr, Expr( sum1( b, c ) ) );
표시( 이름 Expr( expr ) );
/*:
이름 Expr(expr) = sum1(a, sum1(b, c));
나도 그것을 좋아하지 않는다.
@XanGregg
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?릴리스 간 일관성도 중요합니다. 모든 언어에는 초기에 만들어진 몇 가지 설계 결함이 있습니다. 누군가(일반적으로 개발자, 기술 지원 전문가 또는 영업 엔지니어)가 다음 사항을 결정합니다.
LongTermGainFromFixing - CostsOfFixing > CostOfDoingNothing
CostsOfFixing은 정말 복잡합니다. 개발자 시간 + 테스트 시간 + 문서화 시간 + 단기 기술 지원 시간 + 이전에 작동했던 JSL이 현재 실패하는 고객 짜증 + 놓친 기회 + 상황을 악화시킬 위험이 있습니다.
CostOfDoingNothing도 복잡합니다. 미래에 얼마나 많은 기술 지원이 필요한지, 문제가 발생할 사용자 수, 이해하고 해결하는 것이 얼마나 어려운지 말입니다. 더 많은 추측.
이 포럼, 위시리스트 포럼, JMP 담당자, 사용자 그룹 회의 모두 그러한 결정을 내리는 데 도움이 됩니다. 감사해요 @호기 조종을 도와줘서!
@줄리안
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?이것은 흥미로운 문제입니다.예상대로 작동하는 삽입을 수행하는 자신만의 함수를 만들 수 있습니다. [내 생각에는] 마지막 경우를 제외한 모든 경우에 대해 @호기 .이 경우 함수는 Name Expr을 사용하여 해당 표현식을 직접 호출할 때와 동일한 결과를 반환하므로 이것이 '올바른' 결과라고 주장할 수 있습니다.
Names default to here(1);
// Make a new function to show each step of Insert Into:
New Insert Into = function( {exp, newarg, debug = 0 }, local({hd, ar, ne},
//Get the outermost function
hd = Head(exp);
if(debug, show(name expr( hd ) ) );
//Replace that function with a list so insert into works as expected
ar = substitute(name expr( exp ), name expr( hd ), {});
if(debug, show(name expr( ar ) ) );
//Now add the new argument
Insert Into( ar, name expr( newarg ) );
if(debug, show(name expr( ar ) ) );
//and put the orignial function back
ne = substitute(name expr( ar ), {}, name expr( hd ));
if(debug, show(name expr( ne ) ) );
Name expr( ne );
) );
// Test with the examples in the original post, note that they match:
Show( New Insert Into( Expr( If( a ) ), Expr( If( b, c ) ) ) ); // If(a, If(b, c))
Show( New Insert Into( Expr( Not an If( a ) ), Expr( If( b, c ) ) ) ); // Not an If(a, If(b, c))
// Additional examples from hogi post
Show( New Insert Into( Expr( If( a, x ) ), Expr( If( b, c ) ) ) ); // If(a, x, If(b, c))
Show( New Insert Into( Expr( If( a ) ), Expr( If( b ) ) ) ); // If(a, If
Show( New Insert Into( Expr( List( a ) ), Expr( List( b ) ) ) ); // List(a, b)
Show( New Insert Into( Expr( Graph Builder( a ) ), Expr( Graph Builder( b ) ) ) ); // Graph Builder(a, Graph Builder(b))
Show( New Insert Into( Expr( Head( a ) ), Expr( Head( b ) ) ) ); // Head(a, Head(b))
Show( New Insert Into( Expr( Not( a ) ), Expr( Not( b ) ) ) ); // !a
// The last one doesn't seem right but that it is actually being 'fixed' after as it is created:
Show( New Insert Into( Expr( Not( a ) ), Expr( Not( b ) ), debug = 1 ) ); // !a
// This is the same result as if you just call that directly, so I think this is the 'correct' result
Name Expr( Not(a, !b) ); // !a
// This function replaces all the Head expressions, which I think is okay, note this line:
// Name Expr(ar) = {a, {b, c}}
Show( New Insert Into( Expr( If( a, If( b, c ) ) ), Expr( If( d, e ) ), 1 ) ); // If(a, If(b, c), If(d, e))
디버그 내용이 없는 동일한 함수는 다음과 같습니다.
New Insert Into = function( {exp, newarg }, local({hd, ar, ne},
hd = Head(exp);
ar = substitute(name expr( exp ), name expr( hd ), {});
Insert Into( ar, name expr( newarg ) );
ne = substitute(name expr( ar ), {}, name expr( hd ));
name expr( ne );
) );
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?이는 동일한 유형의 표현이 2배로 발생하는 문제를 해결합니다. 예.
그러나 나는 그것이 보편적인 대체품이 아니라는 점을 두려워합니다. 에 집어 넣다 원하는대로.
Show( New Insert Into( Expr( If( a )), Expr( List( b,c )) ) ); // If(a,b,c)
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?그럼에도 불구하고 여기서 나의 주요 의도는 다음과 같습니다.
이해하다 왜 에 집어 넣다 구조를 평면화합니다. 따라서 나중에 해당 기능을 사용할 때마다 해당 기능이 올바른 작업을 수행할 것이라는 확신을 가질 수 있습니다.
2개의 목록의 경우 유용한 기능처럼 보입니다. 자동으로 평면화된 목록을 생성합니다.
흠, 그래프 빌더의 자동 범위 조정만큼 도움이 됩니다. 즉, 93%의 경우에는 도움이 되고 다른 경우에는 ...
히트맵 - 옵션: 고정 눈금 간격(집계 영역)
그 뒤에는 "도움이 되려고" 노력하는 것보다 더 많은 것이 있습니까?
나에게 새로운 점은 이것이 단지 목록에 도움이 되려는 것이 아니라는 것입니다 ...
"솔루션"에 관하여 에 집어 넣다 동일한 유형의 표현식이 2배로 특수한 경우:
- 어쩌면 숨겨진 옵션이 있을 수도 있습니다. 평평하게 만들지 마세요(0|1) ?
expr = Expr( If( a ) );
Insert Into( expr, Expr( REPLACE_ME ) );
Substitute Into( expr, Expr( REPLACE_ME ), Expr( If( b, c ) ) );
Name Expr( expr );
멋진 
참고:
@ih 썼다:
... 첫 번째 인스턴스만 교체해야 합니다..
며칠 전에 비슷한 문제가 있었고 아이디어를 생각해 냈습니다. 표현식 인덱싱: 읽기 및 쓰기 액세스.
Jmp/JSL의 표현식 처리를 새로운 수준으로 끌어올릴 수 있습니다. 유용하다고 생각되면 투표해 보세요.
[이 게시물에 대한 링크와 함께 댓글을 추가했습니다.]
Re: JMP Expr()의 이상함을 설명할 수 있는 사람이 있습니까?
@hogi님이 작성하셨습니다.
동일한 유형의 표현식이 2배인 특수한 경우의 Insert Into 에 대한 "솔루션"에 관하여:
- 어쩌면 숨겨진 옵션이 있을 수도 있습니다: flatten(0|1) ?
그렇지 않은 것 같습니다 ...
다음은 그러한 옵션을 얻고자 하는 바램입니다: Insert Into: Flatten(0|1)