debugging - 在 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" 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"
-racket@test.rkt> x
'()
-racket@test.rkt> lst
'(3)
-racket@test.rkt> 

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

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

相关文章:

list - 返回列表的前 n 个

scheme - 映射!如果列表为空,无法将元素追加到列表中?

scheme - Dr Racket列表功能

Python (pdb) - 排队执行命令

python - 识别当前正在执行哪个函数调用

web-services - 如何在 Spring Tool Suite 中调试 Spring Boot 应用程序

algorithm - 对数运行时间和尾递归

python - 调试 Pandas Dataframe 应用

scheme - Racket 语言变更和模块问题

emacs - 将缓冲区发送到 emacs 中的 repl