将 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)))))

我想在 begin 序列中停下来看看发生了什么以及值是什么。不依赖 ye 'ol 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))

当我执行 C-c C-a 将文件加载到 Geiser 中时,我收到一个 REPL,显示我已经进入调试器。然后我可以检查当前范围内的值,看看发生了什么。
Welcome to Racket v6.6.
racket@> ,enter "/Users/my_username/test.rkt"
[email protected]> x
'()
[email protected]> lst
'(3)
[email protected]>

奇怪的是,(至少对我而言)当 Geiser 尝试对 auto-complete 变量进行 lst 时,REPL 挂起并杀死 REPL 的 racket 进程导致 Emacs 也挂起。不完全确定那是怎么回事,但除此之外,这似乎工作得很好。

关于debugging - 在 Racket 中设置断点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38377994/

10-13 08:33