2011-07-19 58 views
3

我試圖在谷歌找到一個解決方案,我試着用ctrl-c然後:a如何擺脫emacs lisp中的無限循環? (環境:emacs)

但它在這裏不起作用。

我的代碼是這樣的:

(defun game-repl() 
    (loop (print (eval (read))))) 

然後我運行

(game-repl()) 
look() 
+0

通常遊戲環將具有可變'isDone'或'isNotDone',並且將環路此基礎上,例如'(雖然還沒有完成......)'。簡單地將'is-not-done'設置爲false,循環將在下一次迭代時中斷。 –

+0

謝謝@Merlyn,但我的問題是如何打破這一循環回我的Lisp程序設計環境,即emacs的。 –

+1

因此,爲什麼一個評論,而不是答案:)但它會解決這個問題......只需設置'是 - 不done'在REPL。但是,我可以看到您正在尋找編輯器命令,而不是可編程解決方案。 –

回答

8
(loop (setq x (read)) 
     (if (eq x 'exit) 
     (return) 
     (print (eval x)))) 
+0

謝謝。我最好遵循這個例程。 –

1

[參考http://www.psg.com/~dlamkins/sl/chapter05.html]

大多數時候,你寫一個循環形式的時候,你想有一個出路。幸運的是,裏面的任何一個RETURN表單都會導致控制權離開LOOP;任何指定值成爲LOOP形式的值:

? (loop 
    (print "Here I am.") 
    (return 17) 
    (print "I never got here.")) 
"Here I am." 
17 

RETURN通常在條件形式使用,這樣的:

? (let ((n 0)) 
    (loop 
     (when (> n 10) (return)) 
    (print n) (print (* n n)) 
    (incf n))) 

0 0 
1 1 
2 4 
3 9 
4 16 
5 25 
6 36 
7 49 
8 64 
9 81 
10 100 
NIL 
? 
+0

內容豐富。謝謝。 –

6

Emacs模式經常發送中斷信號到下程序僅當你在一排按Ctrl-C的兩倍(即你正在尋找的密鑰序列C-c C-c)。特別是對於SLIME這是真的。

這是因爲C-cprefix key,它通常與其他鍵組合,以訪問一大堆特定於模式的特徵。

-1

這個棧交易所的答案是對谷歌第一主打爲「突破永無止境的循環泥」

C-c C-b 

現在缺少的,是不同的Lisp不同的方式處理這一突破。我找到了這個答案,因爲GNU Clisp只是不攔截SLIME的C-C C-b。它也不是做SBCL做的,它攔截C-C C-B和C-C C-C。

+0

我剛剛確認這是特定於Windows上的Clisp。 – Evan