2011-06-25 11 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のキー=押さえを見つける限りではありません。私は間違って何をしていますか?

+0

どこで実行されているのですか? – bmargulies

+0

あなたが望むものを得ることは、実装に依存する可能性があります。どのLispを使用していますか? –

+0

@bmargulies @Will Hartung - 粘液でアクアマックで動くCCL – WanderingPhd

答えて

1

CCLにはマルチスレッド化があります。バックグラウンドでワーカースレッドを作成して、制御スレッドがブロック読み取りを行ってから、特殊変数を介して通信することができます。以下はLispworksで動作しますが、私はCCLを利用できません。そう、私はここで作ってるんだ、大きな仮定は、CCLのマルチスレッドはマルチスレッドをLWすると似て働くということです

(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は、スレッドを生成するために使用するものは何でも:あなたはMPを翻訳する必要があると思います両方のスレッドが共有状態変数*f*にアクセスできることを確認します。

+2

上記の例では 'cmd-loop'は実際にはループではありません。私の経験では、現実の世界ではおそらくそうであろうし、ちょうど終了するよりも面白い何かをするので、私はその名前を守った。 –

0

私はこれらのことにSLIMEを使用します。 私は通常、このようなリモートコンピュータ上のLispを開始します。

[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 

あなたがこのためにセットアップTRAMPする必要があります作業。 また、リモートで作業したい場合は、適切なssh設定があることを確認する必要があります。 これを/ etc/ssh/ssh_configに追加します。多くのssh接続でハンドシェイクを高速化します。

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

ローカルマシンで動作させたい場合は、すべてがはるかに簡単です。 SLIMEに再接続し、M-x slime-list-threadsを使用して、以前にlispイメージで開始したジョブを停止することができます。

+0

FYIから今後の読者へ:[TRAMP](http://emacswiki.org/emacs/TrampMode) – lindes

関連する問題