首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >符号的函数定义是无效的:循环

符号的函数定义是无效的:循环
EN

Stack Overflow用户
提问于 2015-06-15 14:14:10
回答 1查看 6.3K关注 0票数 7

我正在测试在emacs init.el (Emacs24.3)中加载包。我遵循博客emacs prelude的作者自动加载包,并将代码复制到我的init.el中,如下面所示。但是,我收到了一条关于loop函数/符号的错误消息,它说:

代码语言:javascript
复制
Symbol's function definition is void: loop

有谁能解释一下如何修复代码吗?

我在网上搜索过,loop似乎是cl-lib中的宏。我的猜测是,loop的定义缺失了,我试图通过添加(require 'cl-lib)来修复这个问题,如代码所示,但是错误仍然存在。对于类似的错误消息,还有其他这样的问题,例如:ELisp: cl-循环用于“符号作为变量的值为空”符号的函数定义为无效:声明-函数。但是错误信息在遗漏的内容上是不一样的,答案大多建议使用替代路径,例如使用更新版本的emacs。

-代码--

代码语言:javascript
复制
(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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 15:23:57

cl-lib包是在Emacs24.3中引入的,它提供了许多通用Lisp特性,所有这些特性都带有cl-前缀。在此之前,使用这些特性的唯一方法是要求cl库,并使用无前缀的名称,例如loop而不是cl-loop。但是,由于名称冲突的可能性,这是不可取的,通常建议在可能的情况下使用前缀名称。

由于您正在使用Emacs24.3,修复此问题的“正确”方法是将loop替换为cl-loop,将return替换为cl-return

代码语言:javascript
复制
(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版本。

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

代码语言:javascript
复制
(defun prelude-packages-installed-p ()
  (cl-every 'package-installed-p prelude-packages))

关于cl-every + cl-libevery + cl的相同问题也适用。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30847443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档