emacs:Symbol';s函数定义为void:loop

emacs:Symbol';s函数定义为void:loop,emacs,emacs-prelude,Emacs,Emacs Prelude,我正在测试在emacsinit.el(emacs 24.3)中加载包。我跟随emacs prelude的作者自动加载包,并将那里的代码复制到我的init.el中,如下图所示。但是,我收到一条关于循环函数/符号的错误消息,上面说: Symbol's function definition is void: loop 有人能解释一下如何修复代码吗 我在互联网上搜索过,似乎loop是cl-lib中的一个宏。我猜循环的定义丢失了,我试图通过添加(require'cl lib)来解决问题,如代码所示,但

我正在测试在emacs
init.el(emacs 24.3)中加载包。我跟随
emacs prelude
的作者自动加载包,并将那里的代码复制到我的
init.el
中,如下图所示。但是,我收到一条关于
循环
函数/符号的错误消息,上面说:

Symbol's function definition is void: loop
有人能解释一下如何修复代码吗

我在互联网上搜索过,似乎
loop
cl-lib
中的一个宏。我猜
循环
的定义丢失了,我试图通过添加
(require'cl lib)
来解决问题,如代码所示,但错误仍然存在。类似错误消息上还有其他SO问题,例如:。但是错误信息在缺少什么方面是不同的,答案主要是建议替代路线,例如使用更新版本的emacs

--代码--


cl-lib
包是在Emacs 24.3中引入的,它提供了许多常见的Lisp特性,所有这些特性都带有
cl-
前缀。在此之前,使用这些功能的唯一方法是要求使用
cl
库,并使用不固定的名称,例如
loop
而不是
cl loop
。但是,这是不鼓励的,因为可能会发生名称冲突,如果可能的话,通常建议使用前缀名称

由于您使用的是Emacs 24.3,解决此问题的“正确”方法是将
循环
替换为
cl循环
,将
返回
替换为
cl返回

(defun prelude-packages-installed-p ()
  (cl-loop for p in prelude-packages
           when (not (package-installed-p p)) do (cl-return nil)
           finally (cl-return t)))
(您不需要
(需要'cl-lib)
,因为
cl-loop
cl-return
是自动加载的。)

或者,您可以添加
(require'cl)
,以访问不固定的名称,并保持代码不变。这也适用于早期的Emacs版本


我不禁注意到,这个函数可以写得更简洁:

(defun prelude-packages-installed-p ()
  (cl-every 'package-installed-p prelude-packages))

关于
cl-every
plus
cl-lib
vs
every
cl
的相同问题也适用。

这可能会有所帮助:(Emacs 24.3.1):loop是
cl.el中的
cl-loop'的别名。cl loop是'cl macs.el'中的一个Lisp宏。执行C-HF循环。我必须要求cl lib使cl every在emacs 24.5.1中工作
(defun prelude-packages-installed-p ()
  (cl-every 'package-installed-p prelude-packages))