在自定义REPL中使用Slime autodoc

时间:2011-11-10 18:44:09

标签: emacs common-lisp slime

我正在使用SLIME和EMACS进行Common LISP,使用SBCL编译器。 SLIME的autodoc功能,其中函数参数显示在迷你缓冲区中,工作正常。

但是当我按照以下方式执行自定义REPL时:

(defun game-repl ()
  (let ((cmd (game-read)))
    (unless (eq (car cmd) 'quit)
      (game-print (game-eval cmd))
      (game-repl))))

autodoc功能不再起作用。不在LISP缓冲区中,而不在我的自定义REPL中。可能是因为SBCL进程忙于我的REPL(等待输入)并且无法与SLIME通信。

在我使用C-u M-x slime启动另一个SBCL进程后,autodoc功能再次起作用,但只能在LISP缓冲区中使用。

那么,有没有办法在我的自定义REPL中获取SLIME autodoc?

1 个答案:

答案 0 :(得分:2)

我认为你的结论是swank后端(在你的sbcl进程中)很忙是正确的。 IIRC slime有同步和异步命令,你的game-repl将是一个不允许异步文档命令进入后端的同步命令 - 相反,在slime REPL中编写常规命令时,后端是空闲的,因此doc查询可以通过。

但是请原谅我也想知道你在这个特定案例中所做的事情是否有意义 - 自定义REPL的目的可能是其中一个或两个:

  • 公开有限或合成的命令集
  • 提供非标准控制/语法结构

并且在任何一种情况下,对自定义REPL的输入可能与sli​​me可能为您自动记录的常规代码不同。

可能的选择是提供一个有限的“游戏”命名空间,你可以在常规粘液REPL中玩,然后还提供一个单独的面向生产的REPL与一个只允许访问该命名空间中的符号的阅读器? (讨论了common-lisp沙盒here。)