Mathematica - 为什么TreeForm [未评估[4 ^ 5]]评估4 ^ 5?

Wil*_*sch 9 evaluation wolfram-mathematica operator-precedence

如果我给Mathematica输入

TreeForm[Unevaluated[4^5]]
Run Code Online (Sandbox Code Playgroud)

我希望看到三个盒子 - 电源,4和5.

相反,我看到一个1024的单个框.任何人都可以解释?

Mr.*_*ard 18

A级Unevaluated与各评价剥离,这样你就可以得到你想要什么:

TreeForm[Unevaluated@Unevaluated[4^5]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我认为这种情况比这个解决方案更加微妙.如果我们尝试`f [Unevaluated [4 ^ 5]]`和一些通用的未定义的`f`,我们得到相同的回报(我们应该)."Unevaluated"相当于一个临时的"Hold*" - 属性,在本例中是"TreeForm".那么论证会发生什么,由`TreeForm`内部决定.事实上,一层"未评估"是不够的,揭示了一些可能在"TreeForm"的实现中被认定为评估泄漏的东西 - 显然它评估了在其实现中的某个地方传递了表达式. (5认同)
  • 继续......但是,如果有的话,没有办法知道我需要多少级别的Unevaluated.在其他一些情况下(其他内置插件),我们可能只需要一个级别,如OP预期的那样.换句话说,IMO行为的这个方面或者`TreeForm`是相当令人费解和不直观的(对我而言,我在这里加入OP),并且具有多个级别的"Unevaluated"的解决方案揭示了关于`TreeForm的内部结构的某些细节. ,虽然完全有效,但应该具有专门针对`TreeForm`定制的变通方法的状态,而不是针对其他内置插件的类似情况的一般解决方案. (5认同)
  • @belisarius你的例子很特别,因为`FullForm`很特别 - 在某些方面它不是一个正常的函数,请参阅我对这篇文章的评论:http://stackoverflow.com/questions/4851948/return-equality-from- mathematica-function/4854542#4854542.但我们可以做一个非常简单的实验:`f [x_]:= Hold [x]; f [Unevaluated [4 ^ 5]]`将返回`Hold [4 ^ 5]`.事实上,我们需要为'TreeForm`提供2个"Unevaluated"级别,这意味着`TreeForm`对输入参数进行了一次额外的内部评估,而IMO则不应该这样做,因为它给出了它需要知道的全部内容.我认为这是一个临界错误. (5认同)

Dr.*_*ius 9

相比

TreeForm@Unevaluated[4^5]  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

TreeForm@Hold[4^5]  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

从帮助:

Unevaluated [expr]表示当expr作为函数的参数出现时未评估的形式.

Hold [expr]以未评估的形式维护expr.

所以,当Unevaluated [4 ^ 5]进入TreeForm ......它会被评估......

它的工作原理如下:

f[x_+y_]:=x^y;
f[3+4]
(*
-> f[7]
*)
f[Unevaluated[3+4]]
(*
->81
*)
Run Code Online (Sandbox Code Playgroud)