Логика внутренних сообщений

Я пытаюсь понять логику 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'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 сообщений, которые вы видите: являются сообщениями трассировки и происходят от выполнения некоторого кода верхнего уровня, который не обязательно связан с сообщением, может быть набор текста...

Другие вопросы по тегам