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) )
*/
誰かが何か洞察を持っている場合、または特に式を他の式に確実に挿入する方法を知っていれば(「Eval Insert」や文字列を使用するのではなく)、それは素晴らしいことです。ありがとう!
高度な統計モデリング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 は引数を 1 つではなく 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 (または not an if) を関数名にすることは、JMP が組み込みとして認識しません。 { list } の例では、{...} は List(...) と同じであり、は組み込み関数名。
expr = Expr( sum( a ) );
Insert Into( expr, Expr( sum( b, c ) ) );
Show( Name Expr( expr ) );
/*:
名前 Expr(expr) = Sum(a, b, c);
//:*/
expr = Expr( sum1( a ) );
Insert Into( expr, Expr( sum1( b, c ) ) );
Show( Name Expr( expr ) );
/*:
名前 Expr(expr) = sum1(a, sum1(b, c));
私もそれは好きではありません。
@XanGregg
Re: JMP Expr() の奇妙さ、誰か説明できますか?リリース間での一貫性も重要です。 どの言語にも、初期段階で作られた設計上の欠陥がいくつかあります。 誰か (通常は開発者とテクニカル サポート スペシャリストまたはセールス エンジニア) が次のことを決定します。
LongTermGainFromFixing - 修理コスト > 何もしないコスト
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% のケースでは役に立ちますが、他のケースでは...
ヒートマップ - オプション: 固定ティック間隔 (集約エリア)
その背後には「役に立ちたい」という努力以上のものがあるのでしょうか?
私にとって、それは単にリストを役立つように努めているだけではないということです...
の「解決策」についてに挿入同じタイプの式が 2x という特殊な場合:
- おそらく隠れたオプションがあるかもしれません:平らにしないでください(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)