2015-06-15 13 views
5

我正在測試emacs的加載包​​(Emacs 24.3)。我跟着a blogemacs prelude的作者自動加載包,並將代碼複製到我的​​中,如下所示。但是,我得到了loop函數/符號,它說的錯誤消息:emacs:Symbol的函數定義是void:loop

Symbol's function definition is void: loop 

可有人請解釋如何修復代碼?

我在互聯網上搜索過,看起來loop是一個宏,在cl-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 
+0

這可能有所幫助:(Emacs 24.3.1):loop是cl.el中'cl-loop'的別名。並且 cl-loop是'cl-macs.el'中的一個Lisp宏。做C-h f循環。 – aartist

回答

9

cl-lib包被在Emacs 24.3引入,並且提供了大量的Common Lisp的功能,所有與cl-前綴。在此之前,使用這些功能的唯一方法是要求cl庫,並使用前綴不明的名稱,例如loop而不是cl-loop。但是,由於可能存在名稱衝突,因此不鼓勵這樣做,並且如果可能的話,通常建議使用前綴名稱。

由於您使用Emacs的24.3, 「正確」 的方式來解決,這將是與cl-returncl-loopreturn更換loop

(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-lib VS everycl適用。

+0

我不得不要求cl-lib獲得cl-every才能在emacs 24.5.1中工作 –