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

最近,我一直对更好地理解编译器后端所做的优化感兴趣。我认为使用Mathematica来探索它可能会有所帮助,因为它可以很容易地创建,显示和操作语法树。 我想我会从简单开始,看看不断传播。所以我写了一个简单的函数,并试图查看语法树。
f2[x_, y_] := Module[{temp1},
  temp1 = 5;
  Return[(x + temp1)*y];
  ]
FullForm[f2]
然而,FullForm [f2]的结果只是f2。我知道这个表达式的右边必须存储在Mathematica的某个地方,所以我的问题是它在哪里,是否可以在使用SetDelayed运算符“:=”创建此规则后对其进行修改? 与此同时,我发现我可以使用函数符号来实现我的目标,但我仍然想了解Mathematica做得更好。
f1 = Function[{x, y}, Module[{temp1},
   temp1 = 5;
   Return[(x + temp1)*y]
   ]
  ]
TreeForm[f1]
    
已邀请:
带模式的
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}
这是一个包含有关值列表的更多信息的教程。 HTH!     

要回复问题请先登录注册