【问题标题】:Set breakpoint in Racket?在 Racket 中设置断点?
【发布时间】:2016-07-14 15:14:41
【问题描述】:

将 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 语言)。

【问题讨论】:

  • 设置断点、单步执行等是通常与调试器或 IDE 而非语言相关联的功能。对于#lang racket,标准调试器内置于 DrRacket。有一个 debug 模块 [docs.racket-lang.org/debug/… 和一个不稳定的库 [docs.racket-lang.org/unstable/… 可以作为 Racket 语言程序的一部分。这些可能比“打印”更易于管理。
  • @147pm 使用 DrRacket 中的图形调试器来获取断点。 docs.racket-lang.org/drracket/debugger.html
  • 特别问的问题不是 DrRacket。
  • @147pm 遗憾的是,目前 DrRacket 中内置了唯一的 Racket 调试器。虽然如果你想写一个命令行调试器,我们也很乐意。 :D

标签: debugging scheme racket


【解决方案1】:

正如@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-complete lst 变量时,REPL 挂起并杀死 REPL 的 racket 进程导致 Emacs 也挂起。不完全确定这是怎么回事,但除此之外这似乎效果很好。

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2020-01-21
    • 2011-10-31
    • 2011-11-19
    • 1970-01-01
    • 2014-09-22
    • 2019-12-18
    • 2010-10-14
    相关资源
    最近更新 更多