emacs: 符号的函数定义为空:循环

8

我正在测试在Emacs 24.3中加载包的方法,具体涉及IT技术。我遵循了emacs prelude作者的博客中介绍的自动加载包的方法,并将其中的代码复制到我的init.el文件底部。然而,我收到了一个有关loop函数/符号的错误信息,如下所示:

Symbol's function definition is void: loop

请问有人能解释如何修复这段代码吗?

我在互联网上搜索了一下,发现loopcl-lib中的宏。我猜测loop的定义可能缺失,于是我尝试通过添加(require 'cl-lib)来修复问题,如代码所示,但错误仍然存在。还有其他类似错误消息的SO问题,例如:ELisp: cl-loop for "Symbol's value as variable is void"Symbol's function definition is void: declare-function。但错误消息不同,答案大多建议使用较新版本的emacs等替代方法。

-- 代码 --

(require 'package)
(add-to-list 'package-archives
  '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(package-initialize)

;;; check & load packages
(defvar prelude-packages
  '( haskell-mode )
  "A list of packages to ensure are installed at launch.")

;;(require 'cl-lib) ;debug
(defun prelude-packages-installed-p ()
  (loop for p in prelude-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

(unless (prelude-packages-installed-p)
  ;; check for new packages (package versions)
  (message "%s" "Emacs Prelude is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
  ;; install the missing packages
  (dolist (p prelude-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(provide 'prelude-packages)
;;; end load packages

这可能会有所帮助:(Emacs 24.3.1):loop是cl.el'中cl-loop'的别名。而cl-loop是`cl-macs.el'中的一个Lisp宏。请执行C-h f loop。 - aartist
1个回答

12
cl-lib 包在 Emacs 24.3 中被引入,提供了许多 Common Lisp 特性,所有特性都带有 cl- 前缀。在此之前,使用这些特性的唯一方法是需要引入 cl 库,并使用无前缀的名称,例如使用 loop 代替 cl-loop。然而,由于名称冲突的可能性,不建议这样做,通常建议尽可能使用有前缀的名称。
由于您正在使用 Emacs 24.3,"正确"的修复方法是将 loop 替换为 cl-loop,并将 return 替换为 cl-return
(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)))

您不需要使用(require 'cl-lib),因为cl-loopcl-return已经自动加载。

或者,您可以添加(require 'cl)来获得无前缀名称的访问权限,并保留代码不变。这也适用于早期的Emacs版本。


我注意到这个函数可以更简洁地编写:

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

同样的问题也适用于 cl-everycl-libeverycl 的组合。

我不得不在Emacs 24.5.1中使用cl-lib才能让cl-every正常工作。 - Jimmy Petersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接