Логика внутренних сообщений
Я пытаюсь понять логику Message
поведение.
Рассмотрим оценку следующего:
On[]
Sin[1,1]
После оценки выше вы получите около 830 (!) Messages
(в Mathematica 7).
Все эти Messages
возникли во время производства одного:
Sin::argx: Sin called with 2 arguments; 1 argument is expected. >>
(это один, но последний Message
).
Последний Message
Message::trace: Message[Sin::argx,Sin,2] --> Null. >>
соответствует завершению работы внутреннего Mathematica's Message
функция. Большинство других Messages
перейти от оценки $NewMessage
а также $MessagePrePrint
,
Мои вопросы:
1) Почему нет бесконечной петли Message
поколение? Если звонит Message[Sin::argx,Sin,2]
производит более 830 других Messages
почему каждый из них не производит одинаковое количество Messages
? Как можно смоделировать такое поведение (написав аналог Message
)?
2) Можно ли заставить Message
не производить никаких дополнительных Messages
когда он вызывается в режиме трассировки (я имею в виду режим после оценки On[]
)?
2 ответа
Кажется, я нашел один способ достичь с помощью встроенной функции Message
что я хочу:
Unprotect[Message];
Message[_, HoldForm[Block[List[$MyMagicalTag$, ___], _]], _] := Null;
Message[args___] /;
Block[{$MyMagicalTag$, Message}, Not@TrueQ[inMsg]] :=
Block[{$MyMagicalTag$, inMsg = True, lastargs = HoldComplete[args]},
Message[args]];
Message[args___] /;
Block[{$MyMagicalTag$,
Message}, (inMsg && (HoldComplete[args] =!= lastargs))] := Null;
Protect[Message];
Теперь все работает как положено:
In[6]:= On[]
In[7]:= Sin[1,1]//AbsoluteTiming
During evaluation of In[7]:= Message::trace: Message[Sin::argx,Sin,2] --> Block[{$MyMagicalTag$,inMsg=True,lastargs=HoldComplete[Sin::argx,Sin,2]},Message[Sin::argx,Sin,2]]. >>
During evaluation of In[7]:= Sin::argx: Sin called with 2 arguments; 1 argument is expected. >>
During evaluation of In[7]:= AbsoluteTiming::trace: AbsoluteTiming[Sin[1,1]] --> {0.1502160,Sin[1,1]}. >>
Out[7]= {0.1502160,Sin[1,1]}
Единственная проблема с вышеперечисленным состоит в том, что загрузка процессора все еще высока, как вы можете видеть из времени.
Другие проверенные случаи также работают правильно:
In[8]:= 1+1//AbsoluteTiming
During evaluation of In[8]:= Plus::trace: 1+1 --> 2. >>
During evaluation of In[8]:= AbsoluteTiming::trace: AbsoluteTiming[1+1] --> {0.0400576,2}. >>
Out[8]= {0.0400576,2}
Спасибо Mr.Wizard за помощь.
Я не понимаю, почему необходимо включить все сообщения с On
, Можете ли вы не только активировать нужное вам подмножество? Справочная страница On
в разделе "Дополнительная информация" перечислены различные категории, которые могут оказаться полезными. Если вы решите действовать, как указано, вы можете отключить трассировку сообщений, явно отключив их сразу после On[]
:
On[]; Off[General::trace];
Sin[1, 1]
Это выводит только два сообщения. Следовательно, 830 сообщений, которые вы видите: являются сообщениями трассировки и происходят от выполнения некоторого кода верхнего уровня, который не обязательно связан с сообщением, может быть набор текста...