2011-11-10 82 views
0

我使用SLIME和EMACS進行Common LISP,並使用SBCL編譯器。 SLIME的autodoc功能,其中函數參數顯示在minibuffer中,工作正常。Slime autodoc在定製REPL時

但是,當我執行類似以下的自定義REPL:

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

的車博士功能不工作了。不在LISP緩衝區中,也不在我的自定義REPL中。可能是因爲SBCL進程忙於我的REPL(等待輸入)並且無法與SLIME通信。

後,我開始另一個SBCL過程與C-u M-x slime,車博士將再次特點的作品,但只有在LISP緩衝區。

那麼,有沒有辦法讓我的自定義REPL中的SLIME autodoc?

+0

我曾經有過幾次這種情況。有時候,SWANK,Emacs和REPL之間的狀態似乎被搞亂了。 –

+0

您是否嘗試在一個線程中啓動您的自定義REPL? 即使用'bordeaux-threads' '(bordeaux-threads:make-thread#'game-repl)' – Daimrod

回答

2

我認爲你是在總結了斯旺克後端(在你的SBCL過程)是忙碌正確的。 IIRC slime既有同步命令又有異步命令,而你的game-repl將是一個同步命令,它不允許異步文檔命令進入後端 - 相反,在編寫粘液REPL中的常規命令時,後端是閒置,所以文檔查詢可以通過。

但請原諒我也想知道是否你在做什麼在這種特殊情況下才有意義 - 一個自定義的目的REPL大概是一個或兩個:

  • 暴露在有限的或合成的命令設置
  • 提供非標控制/語法結構

,並在這兩種情況下,輸入自定義的REPL可能不等同於普通的代碼,粘液能自動文檔爲您服務。

可能一個選項是提供一個有限的「遊戲」命名空間,您可以在常規粘液REPL中玩耍,然後還提供一個單獨的面向生產的REPL,其中只有一個閱讀器可以訪問符號命名空間? (有一個關於普通lisp沙盒的討論here。)

+0

我正在使用我的自定義REPL來「玩遊戲」,也就是瀏覽遊戲樹。不在我的命令中的輸入得到正常評估,以幫助進行調試。這樣我可以在遊戲運行時檢查遊戲樹。 – chrm