【发布时间】:2011-04-19 21:03:44
【问题描述】:
如果我给 Mathematica 输入
TreeForm[Unevaluated[4^5]]
我希望看到三个盒子——功率、4 和 5。
相反,我看到一个带有 1024 的框。谁能解释一下?
【问题讨论】:
标签: wolfram-mathematica evaluation operator-precedence
如果我给 Mathematica 输入
TreeForm[Unevaluated[4^5]]
我希望看到三个盒子——功率、4 和 5。
相反,我看到一个带有 1024 的框。谁能解释一下?
【问题讨论】:
标签: wolfram-mathematica evaluation operator-precedence
每次评估都会剥离Unevaluated 的等级,因此您可以得到您想要的:
TreeForm[Unevaluated@Unevaluated[4^5]]
【讨论】:
f 尝试f[Unevaluated[4^5]],我们会得到同样的结果(我们应该这样做)。 Unevaluated 相当于一个临时的Hold* - 属性,在本例中为TreeForm。那么这个论点会发生什么,由TreeForm internals 决定。Unevaluated 的一层是不够的,这揭示了在TreeForm 的实现中可能被称为评估泄漏的东西 - 显然它评估了在其实现中的某个地方传递了一次表达式。
TreeForm 相当令人费解和不直观(对我来说,我在这里加入了 OP),而具有多个级别的解决方案 Unevaluated 揭示了有关 TreeForm 内部的某些细节,并且,虽然完全有效,但应该具有专门为 TreeForm 量身定制的解决方法的状态,而不是针对其他内置插件的类似情况的通用解决方案。
FullForm[Unevaluated[4^5]] 按预期工作
FullForm 很特别——在某些方面它不是一个正常的功能,请参阅我对这篇文章的cmets:stackoverflow.com/questions/4851948/…。但是我们可以做一个非常简单的实验:f[x_] := Hold[x]; f[Unevaluated[4^5]] 将返回Hold[4^5]。事实上,对于TreeForm,我们需要 2 个级别的Unevaluated,这意味着TreeForm 对输入参数进行了一次额外的内部评估,而 IMO 不应该这样做,因为它已经给出了它需要知道的所有信息。我认为这是一个临界错误。
比较
TreeForm@Unevaluated[4^5]
与
TreeForm@Hold[4^5]
来自帮助:
未评估[expr] 当 expr 作为函数的参数出现时,表示 expr 的未计算形式.
和
保持[expr] 以未评估的形式维护 expr。
所以,当 Unevaluated[4^5] 进入 TreeForm ...它被评估 ...
它的工作原理是这样的:
f[x_+y_]:=x^y;
f[3+4]
(*
-> f[7]
*)
f[Unevaluated[3+4]]
(*
->81
*)
【讨论】: