在 Racket 中设置断点?

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 语言)做得更好的话,我会改用它们。

GDP*_*DP2 2

正如 @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-completelst变量时,REPL 挂起并终止racketREPL 进程导致 Emacs 也挂起。不太清楚这到底是怎么回事,但除此之外这似乎运作良好。