emacs:Symbol的函数定义是void:loop

tin*_*lyx 6 emacs emacs-prelude

我正在测试在emacs中加载包init.el(Emacs 24.3).我按照作者的博客emacs prelude自动加载包,并将代码复制到我init.el的底部.但是,我收到有关loop函数/符号的错误消息,其中说:

Symbol's function definition is void: loop
Run Code Online (Sandbox Code Playgroud)

有人可以解释如何修复代码吗?

我在互联网上搜索过,似乎这loop是一个宏cl-lib.我的猜测是loop缺少定义,我试图通过添加修复问题(require 'cl-lib),如代码所示,但错误仍然存​​在.关于类似的错误消息还有其他SO问题,例如:ELisp:"符号的值作为变量的空白"的cl循环,符号的函数定义是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
Run Code Online (Sandbox Code Playgroud)

leg*_*cia 11

cl-lib软件包在Emacs 24.3中引入,并提供了许多Common Lisp功能,所有功能都带有cl-前缀.在此之前,使用这些功能的唯一方法是要求cl库,并使用未加前缀的名称,例如,loop而不是cl-loop.但是,由于可能存在名称冲突,因此不建议这样做,并且如果可能,通常建议使用带前缀的名称.

由于您使用Emacs的24.3,"正确"的方式来解决这一问题将是取代loopcl-loopreturncl-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)))
Run Code Online (Sandbox Code Playgroud)

(你不需要(require 'cl-lib),因为cl-loop并且cl-return是自动加载的.)

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


我不禁注意到这个功能可以写得更简洁:

(defun prelude-packages-installed-p ()
  (cl-every 'package-installed-p prelude-packages))
Run Code Online (Sandbox Code Playgroud)

关于cl-everyplus cl-libvs everyplus 的相同问题cl适用.