我正在使用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?
答案 0 :(得分:2)
我认为你的结论是swank后端(在你的sbcl进程中)很忙是正确的。 IIRC slime有同步和异步命令,你的game-repl
将是一个不允许异步文档命令进入后端的同步命令 - 相反,在slime REPL中编写常规命令时,后端是空闲的,因此doc查询可以通过。
但是请原谅我也想知道你在这个特定案例中所做的事情是否有意义 - 自定义REPL的目的可能是其中一个或两个:
并且在任何一种情况下,对自定义REPL的输入可能与slime可能为您自动记录的常规代码不同。
可能的选择是提供一个有限的“游戏”命名空间,你可以在常规粘液REPL中玩,然后还提供一个单独的面向生产的REPL与一个只允许访问该命名空间中的符号的阅读器? (讨论了common-lisp沙盒here。)