我非常喜欢Eval(Substitute(Expr(...), Expr(..), Expr(.)))
:)
唯一的缺点: Expr(...)、Expr(..)、Expr(.)
...这让我想到了subst() - substitute() 2.0的想法...一个不评估其参数的函数。
在尝试表达式处理时,我注意到Subst()所需的逻辑与Extract Expr() 的逻辑非常接近:无需使用Expr(),并且只要可能就会应用Name Expr() :
Names Default to here(1);
// direct mode, no Expr necessary
Extract Expr(x^2 + y, x);// -> x
Extract Expr(x^2 + y, c);// no c in x^2 + y -> empty
// Name Expr mode
c=Expr(x^2);
Extract Expr(x^2 + y , c);// looks up c = x^2, find "x^2"" in x^2 +y
精彩的!
... 直到:
Extract Expr(cc * d , cc); // -> cc
cc=Expr(x^2);
Extract Expr(cc * d, cc);// looks up cc = x^2 , so doesn't find cc in cc * d anymore
危险的 ...
在将cc定义为具有名称 expr的符号后,是否仍然可以在Extract Expr中“逐字地”使用c ?
Extract Expr(cc * d , Expr(cc)); // doesn't work
Extract Expr(Expr(cc) , Expr(cc)); // finds Expr(cc)
Extract Expr(cc , Name Expr(Expr(cc))); // -> empty
Extract Expr(Name Expr(Expr(cc)) , Name Expr(Expr(cc))); // finds Name Expr(Expr(cc)), argh!
甚至:
cc=Expr(x^2);
clear symbols(cc);
Extract Expr(cc * d , cc); //-> empty()
或许:
使用自定义函数作为Extract Expr的包装器
Names default to here(1);
dummy=Function ({expression, pattern},
Extract Expr(expression, pattern);
);
cc = Expr(x^2);
dummy( Expr(cc+d), Expr(cc)); // -> cc您是否正在寻找答案?此外,您是否阅读过有关表达式的脚本指南:脚本指南 > 编程方法 > 高级表达式、宏和列表 - 高级表达式,尤其是它们如何求值的部分?
在链接的页面上,我没有找到关于ExtractExpr()的更多信息。
@jthi写道:
你有什么问题想要寻找答案吗?
如何确保 JMP 在表达式cc * d中搜索cc ?
即使 cc 被用作另一个表达式的名称,例如x^2 的表达式。
Extract Expr(cc * d , cc); // -> cc
cc=Expr(x^2);
Extract Expr(cc * d, cc);// looks up cc = x^2 , so doesn't find cc in cc * d anymore
更普遍地说:
自定义函数总是会对其参数进行求值——而通过表达式()函数可以阻止它这样做。
提取表达式始终会在使用名称(如果有)之前检索其背后的未求值表达式 - 用户能否阻止它这样做?
当使用名称作为参数时,平台命令经常会受到干扰——而Eval 函数或许可以解决这个问题。
JSL中总共有多少种参数处理方式?是否存在某种界限?
为什么要在多个地方使用相同的变量名?
删除符号()和清除符号()不一样
Names Default To Here(1);
cc = Expr(x ^ 2);
Delete Symbols(cc);
Extract Expr(cc * d, cc);