只是好奇 Mathematica 用户在遇到运行时错误时如何调试他们的代码。我觉得 Mathematica 是如此强大,以至于大多数编程任务都可以用它来代替,但是当它出现错误时,调试的不便就抵消了它的优势。
我知道 Workbench,但是启动起来很麻烦,而且它基于 Java 的 IDE 编译起来有点慢。
只是好奇 Mathematica 用户在遇到运行时错误时如何调试他们的代码。我觉得 Mathematica 是如此强大,以至于大多数编程任务都可以用它来代替,但是当它出现错误时,调试的不便就抵消了它的优势。
我知道 Workbench,但是启动起来很麻烦,而且它基于 Java 的 IDE 编译起来有点慢。
echo 功能现在已内置,在跟踪错误发生的位置时非常有帮助。
"Echo[x_]:=Module[{},Print[x];x]"
举例说明:在取模 4 后,找到列表中等于 y 的元素数
input = Range@20;
target = 3;
foobar[list_, y_] := Length@Select[list, y == Mod[4, #] &]
foobar[input, target]
尽管有效范围内有多个数字,但仍返回 0。使用 echo 修改 foobar 以进行调试:
foobar[list_, y_] := Length@Select[list, y == Echo[Mod[4, #]] &]
将很快揭示 Mod 的论点与预期效果相反。
Trace和TracePrint都可以很方便。我还喜欢定义“任何参数”定义来警告我未定义的调用,例如
f[0] := 1
f[1] := 1
f[n_Integer?Positive] := (f[n]=f[n-1]+f[n-2])
f[wrong___] := ( Print["f had wrong arguments: ",{wrong}]; $Failed)
在 Workbench 中,这些错误定义是断点的好地方。
使用特定参数进行跟踪(此函数传递了什么等)是一种有用的工具。但是,最通用的方法是立即评估工作笔记本中的代码片段,以找到您未预料到或不符合包装代码所需的形状的事情发生的第一个位置等。它也有帮助如果您从一开始就编写模块化代码。