2015-06-15 3 views
5

Ich testete auf das Laden von Paketen in Emacs init.el (Emacs 24.3). Ich folgte a blog vom Autor emacs prelude, um Pakete automatisch zu laden, und kopierte den Code dort in meinen init.el wie in der Unterseite. Aber ich bekam eine Fehlermeldung über die loop Funktion/Symbol, das sagt:Emacs: Symbols Funktionsdefinition ist void: Schleife

Symbol's function definition is void: loop 

Kann jemand bitte erklären, wie Sie den Code zu beheben?

Ich habe im Internet gesucht, und es scheint, dass loop ein Makro in cl-lib ist. Meine Vermutung ist, dass die Definition für loop fehlt, und ich versuchte, das Problem zu beheben, indem Sie (require 'cl-lib) hinzufügen, wie im Code gezeigt, aber der Fehler bleibt. Es gibt andere SO-Fragen zu ähnlichen Fehlermeldungen, zum Beispiel: ELisp: cl-loop for "Symbol's value as variable is void", Symbol's function definition is void: declare-function. Die Fehlermeldungen unterscheiden sich jedoch in den fehlenden Angaben, und die Antworten weisen meist auf alternative Routen hin, beispielsweise auf eine neuere Version von Emacs.

- Code -

(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

Das kann helfen: (Emacs 24.3.1): loop ist ein Alias ​​für 'cl-loop 'in' cl.el'. Und cl-Schleife ist ein Lisp-Makro in 'cl-macs.el '. Do C-h f Schleife. – aartist

Antwort

9

Das cl-lib Paket in Emacs eingeführt wurde, 24,3, und bietet eine Reihe von Common Lisp verfügt, die alle mit dem Präfix cl-. Vorher war es die einzige Möglichkeit, diese Funktionen zu verwenden, die Bibliothek cl zu benötigen und Namen ohne Präfix zu verwenden, z. loop anstelle von cl-loop. Dies wurde jedoch aufgrund der Möglichkeit von Namenskonflikten verhindert, und es wird normalerweise empfohlen, die Präfixnamen zu verwenden, wenn dies möglich ist.

Da Sie Emacs verwenden 24.3, die "richtige" Art und Weise, dies zu beheben wäre zu ersetzen loop mit cl-loop und return mit 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))) 

(Sie müssen nicht (require 'cl-lib) brauchen, weil cl-loop und cl-return werden automatisch geladen.)

Alternativ können Sie (require 'cl) hinzufügen, um Zugriff auf die Namen ohne Präfix zu erhalten, und den Code so lassen, wie er ist. Dies funktioniert auch bei früheren Emacs-Versionen.


Ich kann nicht umhin zu bemerken, dass diese Funktion kurz und bündig geschrieben werden könnte:

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

Das gleiche Problem über cl-every Plus cl-lib vs every Plus cl gilt.

+0

Ich musste cl-lib anfordern, um cl-alle in Emacs 24.5.1 zu arbeiten –

Verwandte Themen