在 MIT Scheme 的 REPL 中有没有快速退出调试器的方法?

Is there a fast way to exit the debugger in MIT Scheme's REPL?

假设我尝试在 MIT Scheme 的 REPL 中使用一个未定义的变量:

1 ]=> blablabla

;Unbound variable: blablabla
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify a value to use instead of blablabla.
; (RESTART 2) => Define blablabla to a given value.
; (RESTART 1) => Return to read-eval-print level 1.

2 error> 

这会自动将我带入调试器。要退出调试器,我必须键入 (restart 1)。是否有另一种方法不涉及为退出调试器而键入 11 个字符?这三个选项都涉及输入 11 个字符,这有点傻。

根据 MIT Scheme 用户手册中关于 interrupting the REPL 的部分:

  • C-c C-c
  • C-g

Abort whatever Scheme evaluation is currently running and return to the top-level REPL. If no evaluation is running, this is equivalent to evaluating (cmdl-interrupt/abort-top-level)

所以有两种方法可以快速退出调试器:

  • CtrlcCtrlc — 不幸的是,当使用带有 rlwrap 的 MIT Scheme 时(即 rlwrap mit-scheme),这种方法是不合适的。在调试器中,rlwrap 以某种方式导致第二个 Ctrlc 被忽略。

  • Ctrlg — 这与 rlwrap 配合使用效果很好,并且需要比上面更少的按键。

根据 Flux 的回答,按 CTRLC 两次可以使用 mit-scheme,但 不行 当它在 rlwrap

内运行时

为了使 rlwrap 对于 CTRLCCTRL 更加“透明” G

  • 使用-W--polling)选项:rlwrap -W会让rlwrap每40毫秒唤醒一次,以检查客户端是否改变了它的终端设置(在你的情况,它 interrupt character)
  • 在你的 .inputrc 中添加几行:
$if mit-scheme
  "\C-c" rlwrap-direct-keypress
  "\C-g" rlwrap-direct-keypress
$endif

这些行将告诉 rlwrap(当包装 mit-scheme 时)传递 CTRLCCTRLG 即使在行编辑的中间。

通过这两项调整,我无法再区分 rlwrapped 和 unwrapped 之间的中断行为 mit-scheme

-W 需要 rlwrap >= 0.41,rlwrap-direct-keypress >= 0.43

要获得更深入的解释 为什么 这行得通(以及为什么需要选项和 .inputrc 条目)请参阅 this rlwrap issue 上的 [=70] =].