使用trace在球拍中显示一个程序

时间:2014-06-15 05:46:31

标签: scheme racket sicp

我一直在完成SICP的最后几个练习,其中几个练习使用高阶函数。目前我正在尝试将我的解决方案中的问题调试到1.45,这会导致arity不匹配。提高误差的功能是两次对定点函数求解器应用平均运算的结果。

如果我可以转储某种程序的表示,这将使我的调试工作更容易,因为该程序已经运行了几个其他程序,在它引发错误之前改变它。我查看了DrRacket的调试文档,将(require racket/trace)(require errortrace)添加到我的模块中,我认为我熟悉调试系统的所有功能 - 但我仍然不知道这该怎么做。

DrRacket的答案是理想的,但任何事情都有帮助。

2 个答案:

答案 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)

一个技巧是为原始函数创建别名。因此,如果您想在某处跟踪加法运算符,除非您这样做,否则跟踪不会允许它:

(需要跟踪)(定义* + +)

然后在代码中的任何地方使用* +,以便密切观察其输出,而不会在其他地方看到+的输出。