2011-06-25 44 views
4

我有程序運行很長一段時間,我想打斷它,但不是用ctrl-c ctrl-c。我也不希望系統每隔一段時間等待一次按鍵。相反,如果我按下一個鍵,我想讓它包裝起來並退出。我發現listenread-char-no-hang,但我無法讓它正常工作。這是我試圖做的lisp中的非阻塞輸入

(let ((f nil)) 
    (loop while (not f) do 
    (if (listen) 
     (setf f t))))) 

很明顯,這是做的比Xanax懶惰只要找到key = - 壓力。我究竟做錯了什麼?

+0

什麼版本的lisp運行在哪裏? – bmargulies

+0

很可能得到你想要的東西,可能是依賴於實現的,所以你使用的是Lisp? –

+0

@bmargulies @Will Hartung - CCL在Aquamacs上運行,粘泥 – WanderingPhd

回答

1

CCL有多線程,我相信。你可以嘗試在後臺產生一個工作線程,並有一個控制線程進行阻塞讀取,然後通過一個特殊的變量進行通信。以下Lispworks的作品,我沒有CCL可用。你必須翻譯的熔點:流程運行功能,無論CCL用來生成線程:

(defparameter *f* nil) 
(defun cmd-loop() 
    (setf *f* nil) 
    (mp:process-run-function "work"() #'do-work) ; Spawn worker 
    (read-char *terminal-io*)      ; Blocking read 
    (setf *f* t)) 
(defun do-work() 
    (loop while (not *f*) 
     do 
      (format t "~a " *f*) 
      (finish-output))) 
(cmd-loop) 

大假設我正在這裏是CCL多線程相若方式工作爲LW多線程,所以兩個線程都可以訪問共享狀態變量*f*

+2

在上面的例子中,'cmd-loop'當然不是一個真正的循環。我保留了這個名字,因爲根據我的經驗,在現實世界中它可能會是,並且會做比退出更有趣的事情。 –

0

我對這些東西使用SLIME。 我通常開始口齒不清在遠程計算機上是這樣的:

[email protected]:~$ ssh -L4005:127.0.0.1:4005 remotecomputer 
[email protected]:~$ sbcl 
(require :asdf) 
(require :swank) 
(setf swank:*dedicated-output-stream-port* nil) 
(swank:create-server) 

然後,我可以從emacs的範圍內開始對筆記本電腦煤泥會話:

M-x slime-connect 
localhost 
4005 
C-x C-f /ssh:remotehost:project/test.lisp 

你必須設置爲流浪漢這工作。 你還應該確保你有一個明智的SSH設置(如果你想遠程工作)。 將此添加到/ etc/ssh/ssh_config。它將加速許多ssh連接的握手。

Host remotehost 
    ControlMaster auto 
    ControlPath /tmp/%[email protected]%h:%p 

不過,如果你只是想有東西在你的本地機器上運行一切容易得多。您可以重新連接SLIME,並使用M-x slime-list-threads來停止您之前在lisp映像中啓動的作業。

+0

供參考的未來讀者:[TRAMP](http://emacswiki.org/emacs/TrampMode) – lindes