Setting up diagnostic error messages in large Mathematica projects

前端 未结 5 1889
春和景丽
春和景丽 2020-12-10 02:12

Whenever I create a large Mathematica project I run into this problem: Preventing avalanche of runtime errors in Mathematica, i.e., Mathematica\'s error message are opaque,

5条回答
  •  感情败类
    2020-12-10 02:39

    Perhaps we have been over thinking this. What if we just tweaked the pattern matching on the arguments a little. For instance, if we modified the function to check for a numeric quantity and added some code to print an error if it fails. For instance,

     TypeNumeric[x_] :=   If[! NumericQ[Evaluate[x]],
     Print["error at "]; Print[Stack[]];    Print["Expression "]; Print[x];    Print["Did   
     not return a numeric value"];Return[False], 
     (*Else*)
     Return[True];] 
     SetAttributes[TypeNumeric, HoldAll];
    

    Step 2: If you have a function, f[x_] that requires a numeric quantity, just write it with the standard pattern test and all should be well

    Input:
    f[x_?TypeNumeric] := Sqrt[x]
    f[Log[y]]
    f[Log[5]]
    Output:
    error at 
    {f}
    Expression 
    Log[y]
    Did not return a numeric value
    f[Log[y]]
    
    Sqrt[Log[5]]
    

    I believe this will work and, it makes robust type checking as simple as a writing a function or two. The problem is that this could be hugely inefficient because this code evaluates the expression x twice, once for the type checking and once for real. This could be bad if an expensive function call is involved.

    I haven't figured out the way around this second problem and would welcome suggestions on that front. Are continuations the way out of this problem?

    Hope this helps.

提交回复
热议问题