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