Почему я должен оценить это дважды? - PullRequest
15 голосов
/ 13 апреля 2011

Я не могу понять, почему я должен оценить это дважды (в 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 Ответ

16 голосов
/ 13 апреля 2011

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

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

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