0

我将 Racket 和 Racket 博士用于教育目的(学习 SICP 书)。Dr. Racket 很棒,它有一个很棒的工具,叫做“trace”。

使用后:

(require trace/racket)
(trace function)

可以看到递归过程中发生了什么。

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

是否有替代工具或实践可以在迭代过程中获得此类信息?

4

1 回答 1

1

跟踪不是调试。在 DrRacket 中,您按下 DEBUG 按钮并右键单击感兴趣部分的边缘,例如if在帮助程序中确定基本情况或默认情况的 a,然后选择“此时暂停”。然后每次你点击 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)))))

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

于 2016-10-11T15:08:59.123 回答