【问题标题】:emacs: Symbol's function definition is void: loopemacs: Symbol 的函数定义为 void: loop
【发布时间】:2015-06-15 14:14:10
【问题描述】:

我正在测试在 emacs init.el (Emacs 24.3) 中加载包。我跟着emacs prelude 的作者a blog 自动加载包,并将那里的代码复制到我的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):循环是cl-loop' in cl.el' 的别名。 cl-loop 是 `cl-macs.el' 中的一个 Lisp 宏。做 C-h f 循环。

标签: emacs emacs-prelude


【解决方案1】:

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-every 加上cl-libevery 加上cl 的相同问题适用。

【讨论】:

  • 我必须要求 cl-lib 才能让 cl-every 在 emacs 24.5.1 中工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多