emacs:Symbol';s函数定义为void:loop
我正在测试在emacsemacs: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)来解决问题,如代码所示,但
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
pluscl-lib
vsevery
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))