【发布时间】:2010-06-28 22:28:27
【问题描述】:
Evaluate at possible issues 上的mathematica 文档说:
Evaluate 只对第一个起作用 级别,直接在一个保持函数中
为什么 Mathematica 有这个限制?因此,如果我有一个以上级别的表达式,请使用以下简化示例:
按住[Plus[Plus[2, 2], 2]]]
现在假设我想看看第二个 Plus 的答案是什么,而不评估低于它的任何级别。我尝试了不同的方法,例如:
In[290]:= Hold[Plus[Evaluate[Plus[2, 2]], 2]]
Out[290]= Hold[Evaluate[2+2]+2]
In[287]:= Hold[Plus[ReleaseHold[Hold[Plus[2, 2]]], 2]]
Out[287]= Hold[ReleaseHold[Hold[2+2]]+2]
在这种情况下,第一个 Hold 使所有内容在第一级及之后都未进行评估。 目标是使用连续的 Hold、ReleaseHold 和 Evaluate 函数来控制从最内层嵌套函数到外层函数的每个阶段的表达式求值。我知道我可以使用 trace 来查看表达式中超出级别 1 的情况,但这会有所不同,有时使用较长的表达式来阅读会很复杂。
似乎唯一的方法是使用 Extract、Part 或 Level 将表达式提取并完全分解为列表;评估我想要的部分表达式;然后为每个阶段重建并重新映射表达式。我可以考虑实现这一点的其他方法或功能吗?
编辑:这可能是一个更好的例子来看看释放第一个保持的方法。用表达式:
Hold[Plus[Plus[2, Plus[2,2]], 2]]]
如果您释放第一个保持并在第三个 Plus 的表达式中放置更高级别的保持,看起来像这样:
in = Plus[Plus[2, Hold[Plus[2,2]]], 2]]]
out = Hold[2+2]+4
您发现当您真的希望 Mathematica 等待时,它会在后台计算较低的级别。
【问题讨论】: