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”或字符串),那就太好了!谢谢!
高级统计建模回复:JMP Expr() 怪异,有人能解释一下吗?有一种解决方法可以完成所请求的任务 - 但实际问题是:为什么?!?尚未得到答复。
添加到Jmp 和 JSL 中的小陷阱
回复: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) (!!)
回复:JMP Expr() 怪异,有人能解释一下吗?你好,
尽管我不确定,但我想知道这种行为是否是因为片段“IF ( a )”不是格式良好的 JSL 表达式。 也就是说,函数 IF 采用 2 个参数,而不是 1 个。 JMP 无法知道“notAnIf( a )”是否是一个格式良好的表达式,因此也许耸耸肩并继续(?)我的全部猜测。
事实上,以下内容按您的意图工作似乎为这个想法添加了一些支持,但这并不能解释为什么@ben_ph的想法是有效的,因为它成功地在我丢失的地方插入了 REPLACE_ME 。
expr = Expr( If( a, . ) );
Substitute Into( expr, expr(.), expr( If( b, c ) ) );
Show( Name Expr( expr ) );

干杯,
布雷迪
回复: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 ) )
回复:JMP Expr() 怪异,有人能解释一下吗?这是密切相关与如何将一个列表插入到另一个列表中。 对于你的问题,我现在怀疑内置函数名称有一个特殊的例外,可以显示这种行为。
expr = Expr( not an If( a ) );
是相同的
expr = Expr( NotAnIf( a ) );
将 NotAnIf(或不是 if)设置为函数名称 JMP 不会将其识别为内置函数。 在 { list } 示例中,{...} 与 List(...) 相同,并且是内置函数名称。
expr = Expr( sum( a ) );
插入( expr, Expr( sum( b, c ) ) );
Show( 名称 Expr( expr ) );
/*:
名称 Expr(expr) = Sum(a, b, c);
//:*/
expr = Expr( sum1( a ) );
插入( expr, Expr( sum1( b, c ) ) );
Show( 名称 Expr( expr ) );
/*:
名称 Expr(expr) = sum1(a, sum1(b, c));
我也不喜欢它。
@XanGregg
回复:JMP Expr() 怪异,有人能解释一下吗?版本之间的一致性也很重要。 每种语言都有一些早期设计的缺陷。 有人(通常是开发人员和技术支持专家或销售工程师)决定是否
修复的长期增益 - 修复成本 > 无所事事的成本
CostsOfFishing 确实很复杂,开发人员时间 + 测试时间 + 文档时间 + 短期技术支持时间 + 客户对以前有效的 JSL 现在失败的恼怒 + 错失机会 + 使情况变得更糟的风险。
CostOfDoingNothing 也很复杂:需要多少技术支持,永远到未来,将遇到这个问题的用户数量,以及理解和解决这个问题有多难。 更多猜测。
该论坛、愿望清单论坛、您的 JMP 代表以及用户组会议都有助于引导您做出决定。 谢谢@hogi帮助驾驶!
@朱利安
回复:JMP Expr() 怪异,有人能解释一下吗?这是一个有趣的问题。您可以创建自己的函数来执行插入操作,该函数按预期工作[我认为],对于除最后一种情况之外的所有情况@hogi 。对于这种情况,尽管该函数返回的结果与直接使用 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 );
) );
回复:JMP Expr() 怪异,有人能解释一下吗?这解决了 2x 相同类型表达式的问题。 是的。
但我担心,它并不是通用的替代品插入正如人们所希望的那样。
Show( New Insert Into( Expr( If( a )), Expr( List( b,c )) ) ); // If(a,b,c)
回复: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 中的表达式处理提升到一个新水平。 如果你觉得它有用,你可以投票给它......
[我添加了一条带有这篇文章链接的评论。]
回复:JMP Expr() 奇怪,有人能解释一下吗?
@hogi写道:
关于插入的“解决方案”,特殊情况是 2x 相同类型的表达式:
- 也许有一个隐藏的选项: flatten(0|1) ?
似乎不是这样……
希望获得这样的选项: 插入:Flatten(0|1)