Использование Mathematica для понимания оптимизации компилятора: доступ к определениям, созданным с помощью SetDelayed? - PullRequest
4 голосов
/ 06 ноября 2010

В последнее время меня интересует лучшее понимание оптимизаций, выполняемых бэкэндами компилятора. Я подумал, что использование Mathematica для изучения этого может быть полезным, потому что это делает создание, отображение и управление синтаксическими деревьями довольно легкими.

Я думал, что начну с простого и посмотрю на постоянное распространение. Поэтому я написал простую функцию и попытался взглянуть на дерево синтаксиса.

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

Результат FullForm [f2], однако, был просто f2. Я знаю, что правая часть этого выражения должна храниться где-то в Mathematica, поэтому у меня вопрос, где он находится и можно ли его изменить после создания этого правила с помощью оператора SetDelayed ": ="?

В то же время я обнаружил, что могу использовать символ Function для достижения того, к чему стремлюсь, но я все же хотел бы понять, что Mathematica делает немного лучше.

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

alt text

1 Ответ

4 голосов
/ 06 ноября 2010
Определения

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!

...