2011-04-24 65 views
4

我想弄清楚的Message行爲邏輯。消息的邏輯內部構件

考慮以下評價:

On[] 
Sin[1,1] 

評估上面你會得到後約830 Messages(在數學 7)(!)。

所有這些都Messages產生一箇中出現了:

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

(這是一個,但最後Message)。

最後Message

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

對應於內部數學Message功能的工作結束。大多數其他Messages的去從$NewMessage$MessagePrePrint評價。

我的問題是:

1)爲什麼有Message一代沒有無限循環?如果在調用Message[Sin::argx,Sin,2]產生其他830多家Messages爲什麼他們每個人不產生Messages類似的號碼是多少?如何模擬這種行爲(編寫Message的模擬)?

2)是否有可能強制Message在追蹤模式下調用時不會產生任何額外的Messages(我的意思是評估On[]後的模式)?

回答

0

看來,我已經找到了實現與單向內置功能Message我想:

Unprotect[Message]; 
Message[_, HoldForm[Block[List[$MyMagicalTag$, ___], _]], _] := Null; 
Message[args___] /; 
    Block[{$MyMagicalTag$, Message}, [email protected][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]} 

上述唯一的問題是,CPU負荷仍然很高,你可以從時序參考。

其他測試情況下也正常工作:

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他help

0

我不理解爲什麼有必要與On打開所有的消息。你不僅可以激活你需要的子集。 「更多信息」部分中的參考頁面On列出了您可能會覺得有用的各種類別。如果你選擇繼續爲所述,您可以通過On[]後立即明確地將其關閉抑制跟蹤消息:

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

該輸出只有兩個消息。因此,你看到的消息的830 ::跟蹤消息和一些頂級代碼執行的起源是沒有必然的關係,可能是排版信息...

+1

我已經調查了這種情況下的一些照顧和結果在我的問題中解釋。所有這些::跟蹤'消息'在評估'Message [Sin :: argx,Sin,2]'時產生。最後有一些對MakeBoxes的調用,但它又是在最後一條消息Message :: trace:Message [Sin :: argx,Sin,2] - > Null之前。 >> '。你的建議是關閉追蹤。我需要關閉「Message」內部的跟蹤和/或理解爲什麼沒有無限循環。 – 2011-04-25 02:46:30

+0

關於這個問題的原因,考慮例如'在[Block]; Sin [1,1]'。如果在一個複雜的程序裏面生成一些'Message',並且我想跟蹤一些Symbol的評估,我可以從Message的評估中得到垃圾信息。我只需要關閉「消息」內部的跟蹤,而不是周圍的代碼。 – 2011-04-25 03:21:13

+0

@Alexey我不認爲你所要求的是可能的,因爲跟蹤不區分內部程序是否使用該符號。我剛剛注意到,在[Block]上運行'Sin [1,1]'這些不需要的消息第二次消失,這可能會有所幫助。 – Sasha 2011-04-25 13:46:14