Логика внутренних сообщений - PullRequest
4 голосов
/ 24 апреля 2011

Я пытаюсь понять логику поведения Message.

Рассмотрим оценку следующего:

On[]
Sin[1,1]

После оценки выше вы получите около 830 (!) MessagesMathematica 7).

Все эти Messages возникли при создании:

Sin::argx: Sin called with 2 arguments; 1 argument is expected. >>

(это один, но последний Message).

Последний Message

Message::trace: Message[Sin::argx,Sin,2] --> Null. >>

соответствует завершению работы внутренней Mathematica Message функции. Большая часть других Messages идет от оценки $NewMessage и $MessagePrePrint.

Мои вопросы:

1) Почему нет бесконечного цикла генерации Message? Если при вызове Message[Sin::argx,Sin,2] выдается более 830 других Messages, почему каждый из них не выдает аналогичное число Messages? Как можно смоделировать такое поведение (написав аналог Message)?

2) Можно ли заставить Message не производить никаких дополнительных Messages, когда он вызывается в режиме трассировки (я имею в виду режим после оценки On[])?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

Кажется, я нашел один способ достичь с помощью встроенной функции 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 за его помощь .

0 голосов
/ 25 апреля 2011

Я не понимаю, почему необходимо включать все сообщения с On. Можете ли вы не только активировать нужное вам подмножество? На странице справки On в разделе «Дополнительная информация» перечислены различные категории, которые могут оказаться полезными. Если вы решите действовать, как указано, вы можете подавить сообщения трассировки, явно отключив их сразу после On[]:

On[]; Off[General::trace];
Sin[1, 1]

Это выводит только два сообщения. Следовательно, 830 сообщений, которые вы видите, являются :: сообщениями трассировки и происходят от выполнения некоторого кода верхнего уровня, который не обязательно связан с сообщением, может быть набором ...

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