The logic of Message internals

前端 未结 2 729
無奈伤痛
無奈伤痛 2021-01-20 01:23

I am trying to figure out the logic of Message behavior.

Consider evaluation of the following:

On[]
Sin[1,1]

After eva

2条回答
  •  难免孤独
    2021-01-20 01:40

    It seems that I have found one way to achieve with built-in function Message what I want:

    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];
    

    Now things work as expected:

    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]}
    

    The only problem with the above is that CPU load is still high as you can see from the timings.

    Other tested cases also work correctly:

    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}
    

    Thanks to Mr.Wizard for his help.

提交回复
热议问题