Почему эта переменная шаблона Mathematica не оценивается? - PullRequest
1 голос
/ 08 ноября 2010

Очевидно, что эти переменные шаблона не работают так, как я ожидал.Вот простой пример:

In[264]  :=  1 /. x_ -> {x, f[x], ToString[x]}
Out[264] := {1, f[1], "x"}

Почему этот последний элемент "x" вместо "1".Следующее работает как ожидалось.

In[267]:= y = 2;
   ToString[y]
Out[268]= "2"

спасибо,
Роб

Ответы [ 2 ]

4 голосов
/ 08 ноября 2010

Правая часть правила оценивается до замены, поэтому вам нужно использовать RuleDelayed (:>) вместо Rule (->):

In[1]:= 1 /. x_ :> {x, f[x], ToString[x]}

Out[1]= {1, f[1], "1"}

Rule и RuleDelayed аналогичны Set (=) и SetDelayed (:=).

HTH!

3 голосов
/ 08 ноября 2010

Попробуйте Trace[1 /. x_ -> {x, f[x], ToString[x]}].В данный момент у меня нет доступа к mathematica, но я полагаю, вы увидите, что замена, в частности ToString[x], оценивается до , когда шаблон применяется, поэтому эффективно вы делаете 1 /. x_ -> {x, f[x], "x"}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...