如何调试迭代程序?

时间:2016-10-11 14:49:49

标签: debugging lisp racket sicp dr.racket

我正在使用Dr. Racket和Racket进行教育(研究SICP书籍)。 Racket博士很棒,它有一个很棒的工具叫做“痕迹”。

使用后:

(require trace/racket)
(trace function)

可以看到递归过程中发生的事情。

但是,此功能不适用于迭代过程。 我希望我能“看到”我的代码在执行时发生了什么。我希望我能看到状态变量值的变化。

是否有其他工具或做法可以在迭代过程中获得这类信息?

1 个答案:

答案 0 :(得分:1)

跟踪不是调试。在DrRacket中,按下DEBUG按钮并右键单击有趣部分的边缘,如if确定帮助中的基本情况或defautl情况,然后选择"此时暂停"。然后,每当你点击Go,你就可以一步一步看到绑定的参数。

如果你想跟踪,你可以跟踪这样的帮助:

(require racket/trace)
(define (reverse lst)
  (define (aux lst acc)
    (if (null? lst)
        acc
        (aux (cdr lst)
             (cons (car lst) acc))))
  (trace aux) ; tracing the helper
  (aux lst '()))

(reverse '(1 2 3 4))

>(aux '(1 2 3 4) '())
>(aux '(2 3 4) '(1))
>(aux '(3 4) '(2 1))
>(aux '(4) '(3 2 1))
>(aux '() '(4 3 2 1))
<'(4 3 2 1)
;==> (4 3 2 1)

如果您想使用已命名的let,只需将其替换为trace-let

(define (reverse lst)
  ;; TODO: Put back to let
  (trace-let aux ((lst lst) (acc '()))
    (if (null? lst)
        acc
        (aux (cdr lst)
             (cons (car lst) acc)))))

使用调试器比在代码中添加行和删除行以便测试它要快得多。