代码之家  ›  专栏  ›  技术社区  ›  Samsdram

使用Mathematica理解编译器优化:访问使用SetDelayed创建的定义?

  •  4
  • Samsdram  · 技术社区  · 15 年前

    最近,我对更好地理解编译器后端所做的优化很感兴趣。我认为使用Mathematica来探索这一点可能会有帮助,因为它使创建、显示和操作语法树变得非常容易。

    我想我应该从简单的开始,看看持续的传播。所以我编写了一个简单的函数,并尝试查看语法树。

    f2[x_, y_] := Module[{temp1},
      temp1 = 5;
      Return[(x + temp1)*y];
      ]
    FullForm[f2]
    

    然而,FullForm[f2]的结果只是f2。我知道这个表达式的右边必须存储在Mathematica中的某个地方,所以我的问题是它在哪里,在使用SetDelayed操作符创建这个规则之后是否可以修改它“:”?

    f1 = Function[{x, y}, Module[{temp1},
       temp1 = 5;
       Return[(x + temp1)*y]
       ]
      ]
    TreeForm[f1]
    

    alt text

    1 回复  |  直到 15 年前
        1
  •  4
  •   Michael Pilat    15 年前

    Set 和 SetDelayed DownValues :

    In[98]:= DownValues[f2]
    Out[98]= {HoldPattern[f2[x_, y_]] :> 
      Module[{temp1}, temp1 = 5; Return[(x + temp1) y];]}
    

    你甚至可以分配回 DownValues[f2]

    In[103]:= 
    DownValues[
      f2] = {HoldPattern[f2[x_, y_]] :> 
       Module[{temp1}, temp1 = 1234; Return[(x + temp1) y]]};
    
    
    In[104]:= f2[1, 2]
    Out[104]= 2470
    

    简单赋值产生自己的值定义,可以使用 OwnValues :

    In[107]:= g=7;
    
    In[108]:= OwnValues[g]
    Out[108]= {HoldPattern[g]:>7}
    

    Here's a tutorial 关于值列表的更多信息。