147*_*7pm 5 debugging scheme racket
将 Emacs/geiser 与 Racket(不是 DrRacket)一起使用,我如何设置断点,然后单步执行代码,在断点处停止?例如,我有这样的代码:
(define (powerset4 lst)
(if (null? lst)
'(())
(append-map (lambda (x)
(begin
(fprintf (current-output-port) "~s ~s ~s\n" x lst x)
(list x (cons (car lst) x))))
(powerset4 (cdr lst)))))
Run Code Online (Sandbox Code Playgroud)
我想在begin序列中停下来看看发生了什么以及值是什么。最好不要依赖你们的printf技巧,即也跟踪某些参数。同样,我使用 Emacs 并使用 Geiser。事实上,如果我能用 Guile 或 Chicken(Geiser 语言)做得更好的话,我会改用它们。
正如 @ben rudgers 提到的,有一种debug语言(和库)似乎可以很好地满足您的需求。我没有使用其他调试库,因为“不稳定”警告有点令人反感。
这是test.rkt根据您的程序改编的示例文件:
#lang racket
(require debug/repl)
(define (powerset4 lst)
(if (null? lst)
'(())
(append-map (lambda (x)
(begin
(list x (cons (car lst) x))
(debug-repl) ;; this is the breakpoint that will enter a REPL
))
(powerset4 (cdr lst)))))
(powerset4 '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
当我将C-c C-a文件加载到 Geiser 中时,我会看到一个 REPL,显示我已进入调试器。然后我可以检查当前范围内的值并查看发生了什么。
Welcome to Racket v6.6.
racket@> ,enter "/Users/my_username/test.rkt"
-racket@test.rkt> x
'()
-racket@test.rkt> lst
'(3)
-racket@test.rkt>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,(至少对我来说)当 Geiser 尝试使用auto-complete该lst变量时,REPL 挂起并终止racketREPL 进程导致 Emacs 也挂起。不太清楚这到底是怎么回事,但除此之外这似乎运作良好。
| 归档时间: |
|
| 查看次数: |
2316 次 |
| 最近记录: |