我一直在完成SICP的最后几个练习,其中几个练习使用高阶函数。目前我正在尝试将我的解决方案中的问题调试到1.45,这会导致arity不匹配。提高误差的功能是两次对定点函数求解器应用平均运算的结果。
如果我可以转储某种程序的表示,这将使我的调试工作更容易,因为该程序已经运行了几个其他程序,在它引发错误之前改变它。我查看了DrRacket的调试文档,将(require racket/trace)
和(require errortrace)
添加到我的模块中,我认为我熟悉调试系统的所有功能 - 但我仍然不知道这该怎么做。
DrRacket的答案是理想的,但任何事情都有帮助。
答案 0 :(得分:5)
添加(需要球拍/跟踪)不会在控制台中抛出任何过程显示。您想使用(trace function-name)
,当您在跟踪调用中使用给定函数时,这将在控制台中打印紫色(默认颜色)行。示例
(define sum (λ (x y) (+ x y)))
(define multiply
(λ (x y)
(multiply-aux x y x)
))
(define multiply-aux (λ (x y res)
(if (= y 0) 0
(if (= y 1) res
(multiply-aux x (- y 1) (sum res x))))))
(require racket/trace)
(trace sum)
在控制台中:
> (multiply 4 5)
>(sum 4 4)
<8
>(sum 8 4)
<12
>(sum 12 4)
在DrRacket 6.0.1中进行了测试
如果您需要更多帮助,请与我联系。
答案 1 :(得分:1)
一个技巧是为原始函数创建别名。因此,如果您想在某处跟踪加法运算符,除非您这样做,否则跟踪不会允许它:
(需要跟踪)(定义* + +)
然后在代码中的任何地方使用* +,以便密切观察其输出,而不会在其他地方看到+的输出。