【问题标题】:Mathematica -- why does TreeForm[Unevaluated[4^5]] evaluate the 4^5?Mathematica - 为什么 TreeForm[Unevaluated[4^5]] 评估 4^5?
【发布时间】:2011-04-19 21:03:44
【问题描述】:

如果我给 Mathematica 输入

TreeForm[Unevaluated[4^5]]

我希望看到三个盒子——功率、4 和 5。

相反,我看到一个带有 1024 的框。谁能解释一下?

【问题讨论】:

    标签: wolfram-mathematica evaluation operator-precedence


    【解决方案1】:

    每次评估都会剥离Unevaluated 的等级,因此您可以得到您想要的:

    TreeForm[Unevaluated@Unevaluated[4^5]]
    

    【讨论】:

    • 我认为情况比这个解决方案看起来更微妙。如果我们用一些通用的未定义的f 尝试f[Unevaluated[4^5]],我们会得到同样的结果(我们应该这样做)。 Unevaluated 相当于一个临时的Hold* - 属性,在本例中为TreeForm。那么这个论点会发生什么,由TreeForm internals 决定。Unevaluated 的一层是不够的,这揭示了在TreeForm 的实现中可能被称为评估泄漏的东西 - 显然它评估了在其实现中的某个地方传递了一次表达式。
    • Continuing... 但是,没有办法知道我们需要多少未评估级别(如果有的话)。在其他一些情况下(其他内置),我们可能只需要一个级别,正如 OP 所期望的那样。换句话说,IMO 这方面的行为或TreeForm 相当令人费解和不直观(对我来说,我在这里加入了 OP),而具有多个级别的解决方案 Unevaluated 揭示了有关 TreeForm 内部的某些细节,并且,虽然完全有效,但应该具有专门为 TreeForm 量身定制的解决方法的状态,而不是针对其他内置插件的类似情况的通用解决方案。
    • @Leonid 举个例子,FullForm[Unevaluated[4^5]] 按预期工作
    • @belisarius 你的例子很特别,因为FullForm 很特别——在某些方面它不是一个正常的功能,请参阅我对这篇文章的cmets:stackoverflow.com/questions/4851948/…。但是我们可以做一个非常简单的实验:f[x_] := Hold[x]; f[Unevaluated[4^5]] 将返回Hold[4^5]。事实上,对于TreeForm,我们需要 2 个级别的Unevaluated,这意味着TreeForm 对输入参数进行了一次额外的内部评估,而 IMO 不应该这样做,因为它已经给出了它需要知道的所有信息。我认为这是一个临界错误。
    • @Leonid ALL 其他 xxxForm 命令将 Unevaluated[ ] 显示为头部。这不仅仅是一个 FullForm[ ] 问题
    【解决方案2】:

    比较

    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
    *)
    

    【讨论】:

    猜你喜欢
    • 2019-07-01
    • 2020-01-26
    • 2014-11-20
    • 2014-02-10
    • 2014-11-22
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多