Почему я должен оценивать это дважды?

Я не могу понять, почему я должен дважды это оценить (в Mathematica 7) для назначения.

Первая оценка:

Unprotect[Rule];
Attributes[Rule]
pp = Plot | LogLinearPlot | ListPlot | ParametricPlot3D;
(h : pp)[True -> False] ^:= Print["Irrelevant data"]

(*

Out[2]= {SequenceHold}

During evaluation of In[1]:= UpSetDelayed::write: Tag Rule in (h:Plot|LogLinearPlot|ListPlot|ParametricPlot3D)[True->False] is Protected. >>

Out[4]= $Failed

*)

Как видно из Out[2]= {SequenceHold}, Unprotect[Rule] работал, но сообщение об ошибке указывает на другое. Если я буду оценивать ячейку во второй раз, присваивание принимает и не генерируется ошибка.

Почему это происходит?

Ответы

Ответ 1

Как вы, возможно, знаете, Mathematica загружает двоичные файлы MX, которые реализуют некоторые из его функций. Эти файлы MX хранят реализации, а также определения и атрибуты.

Это коварно, но ваш Unprotect[Rule] отменен загруженным MX файлом Mathematica, и это объясняет, почему он работал во второй раз. Поскольку Mathematica уже загрузила все файлы MX, которые ему нужны.

Если вы сначала оцениваете все символы в своем выражении, то он перестает жаловаться:

{Unprotect, Rule, Attributes, Plot, LogLinearPlot, ListPlot, 
  ParametricPlot3D, True, False, Print};
Unprotect[Rule];
Attributes[Rule];
pp = Plot | LogLinearPlot | ListPlot | ParametricPlot3D;
(h : pp)[True -> False] ^:= Print["Irrelevant data"]

РЕДАКТИРОВАТЬ Первая оценка необходима для запуска всей автоматической загрузки, прежде чем снимать защиту Rule.