Debugging 在球拍中设置断点?

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

将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语言),我会改用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