如何在emacs lisp中打破无限循环?(环境:emacs)
我尝试使用ctrl-c,然后:a 但它在这里不起作用 我的代码如下:如何在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
(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 这个问题可以参考:
对不起,我没有名声去修改@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