如何摆脱emacs lisp中的无限循环? (环境:emacs)

时间:2011-07-19 06:25:02

标签: emacs lisp elisp

我尝试使用 ctrl - c 然后:a

但它在这里不起作用。

我的代码就像:

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

然后我跑

(game-repl())
look()

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

Emacs模式通常只有当您连续两次按下Ctrl-C时才会向下级程序发送中断信号(即,您要查找的键序列为C-c C-c)。特别是SLIME

这是因为C-c是一个prefix key,通常与其他键结合使用,可以访问一大堆特定于模式的功能。

答案 2 :(得分:1)

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

大多数时候你写一个LOOP表格,你想要出路。幸运的是,在任何地方的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
?

答案 3 :(得分:0)

这个问题可以参考:

  1. 如何以编程方式摆脱原本会无限的循环或
  2. 如何手动停止已经肆虐的无限循环。

@ fred-foo令人满意地回答了第一(似乎是OP的实际问题)。 @ matthias-benkard解决了第二个问题,但他的答案不适用于emacs lisp。

手动停止运行中的无限emacs-lisp循环的实际答案是 Ctrl + g (在emacs-peak中为C-g)。

emacs lisp manual中有一个关于此主题的文档页面。

对不起,我不敢仅仅修改@ matthias-benkard的答案,这个问题在搜索引擎上排名很高...

答案 4 :(得分:-1)

这个Stack Exchange答案是谷歌第一次打击"打破永无止境的循环粘液"

 C-c C-b

缺少的是,不同的lisps以不同的方式处理这种中断。我找到了这个答案,因为GNU Clisp并没有拦截SLIME的C-c C-b。它也不是SBCL所做的,它拦截了C-c C-b和C-c C-c。