我正在使用Dr. Racket和Racket进行教育(研究SICP书籍)。 Racket博士很棒,它有一个很棒的工具叫做“痕迹”。
使用后:
(require trace/racket)
(trace function)
可以看到递归过程中发生的事情。
但是,此功能不适用于迭代过程。 我希望我能“看到”我的代码在执行时发生了什么。我希望我能看到状态变量值的变化。
是否有其他工具或做法可以在迭代过程中获得这类信息?
答案 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)))))
使用调试器比在代码中添加行和删除行以便测试它要快得多。