Debugging 在球拍中设置断点?
将Emacs/geiser与Racket(而不是DrRacket)一起使用,我如何设置一个断点,然后单步执行代码,在断点处停止?例如,我有以下代码:Debugging 在球拍中设置断点?,debugging,scheme,racket,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
(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'olprintf
技巧,也就是跟踪某些参数。同样,我在Emacs中使用Geiser。实际上,如果我能更好地使用Guile或Chicken(Geiser语言),我会改用Guile或Chicken(Geiser语言)。正如@ben rudgers提到的,有一种调试语言(和库),它似乎能很好地满足您的需求。我没有使用其他调试库,因为“不稳定”警告有点令人讨厌
下面是一个示例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-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>
奇怪的是,(至少对我来说)当Geiser试图自动完成lst
变量时,REPL挂起,并杀死REPL的racket
进程,导致Emacs也挂起。不太清楚这到底是怎么回事,但除此之外,这似乎效果不错。设置断点、单步执行等功能通常与调试器或IDE相关,而不是与语言相关。对于#lang racket
,标准调试器内置于DrRacket中。有一个debug
模块[和一个不稳定的库],可以作为Racket语言程序的一部分。这些可能比“打印”更易于管理@147pm使用DrRacket中的图形调试器来获取断点。这个问题是专门为不使用DrRacket而提出的。@147pm遗憾的是,目前唯一的Racket调试器是内置在DrRacket中的。尽管如果您想编写命令行调试器,我们也希望有一个命令行调试器。:d