如何在emacs lisp中打破无限循环?(环境:emacs)

如何在emacs lisp中打破无限循环?(环境:emacs),emacs,lisp,elisp,Emacs,Lisp,Elisp,我尝试使用ctrl-c,然后:a 但它在这里不起作用 我的代码如下: (defun game-repl() (loop (print (eval (read))))) 然后我就跑 (game-repl()) look() [参考http://www.psg.com/~dlamkins/sl/chapter05.html] 大多数时候,在编写循环表单时,您希望有一个解决方法。幸运的是,内部任何地方的返回表单都会导致控件离开循环;指定的任何值都将成为循环表单的值: ? (loop

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

但它在这里不起作用

我的代码如下:

(defun game-repl()
    (loop (print (eval (read)))))
然后我就跑

(game-repl())
look()

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

大多数时候,在编写循环表单时,您希望有一个解决方法。幸运的是,内部任何地方的返回表单都会导致控件离开循环;指定的任何值都将成为循环表单的值:

 ? (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
?

Emacs模式通常仅当您连续按两次Ctrl-C键时才会向下级程序发送中断信号(即,您要查找的键序列是
C-C-C
)。特别是,这一点对我们来说是正确的


这是因为
C-C
是一种通常与其他键结合使用的密码,可以访问一系列特定于模式的功能。

这一堆栈交换答案是谷歌首个“打破永无止境的循环粘液”的成功答案


缺少的是,不同的Lisp处理这种中断的方式不同。我找到这个答案是因为GNU Clisp不拦截SLIME的C-C-b。它也没有像SBCL那样拦截C-C-b和C-C-C

这个问题可以参考:

  • 如何以编程方式打破原本是无限或无限的循环
  • 如何手动停止已经肆虐的无限循环
  • 第一个问题得到了@fred foo的满意回答(这似乎是OP的实际问题)。@matthias benkard已经解决了第二个问题,但他的答案不适用于emacs lisp

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

    中有一个关于此主题的文档页面


    对不起,我没有名声去修改@matthias benkard的答案,这个问题在搜索引擎中排名很高…

    通常游戏循环会有一个变量
    isDone
    isNotDone
    ,并会基于此循环,例如
    (而不是完成的…
    )。只需将
    未完成
    设置为false,循环将在下一次迭代中中断。谢谢@Merlyn,但我的问题是如何将此循环中断回我的Lisp编程环境,即emacs。因此,为什么要添加注释而不是答案:)但这将解决问题。。。只需在REPL中设置
    就可以了。但是,是的,我可以看到你正在寻找一个编辑器命令,而不是一个可编程的解决方案。谢谢你Merlyn。我懂了。我搜索了一些来源。你是对的。我需要“告诉”lisp什么时候出去<代码>(Game repl())
    应发出错误信号,因为参数数量无效(预期为零,但得到一个)<代码>外观很可能不是定义的变量
    ()
    的计算结果为
    nil
    。我刚刚确认这是特定于Windows上的Clisp的。
    ? (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
    ?
    
     C-c C-b