2015-06-15 13 views
5

Testuję ładowanie pakietów w emacs init.el (Emacs 24.3). Śledziłem a blog przez autora emacs prelude, aby automatycznie załadować paczki i skopiowałem tam kod do mojego init.el jak na dole. Jednak mam komunikat o błędzie o loop funkcji/symbol, który mówi:emacs: Definicja funkcji symbolu jest nieważna: pętla

Symbol's function definition is void: loop 

Może ktoś proszę wyjaśnić, jak rozwiązać ten kod?

Szukałem w Internecie i wydaje mi się, że loop to makro w wersji cl-lib. Zgaduję, że brakuje definicji dla loop i próbowałem naprawić problem, dodając (require 'cl-lib), jak pokazano w kodzie, ale błąd pozostaje. Istnieją inne pytania SO dotyczące podobnych komunikatów o błędach, np .: ELisp: cl-loop for "Symbol's value as variable is void", Symbol's function definition is void: declare-function. Jednak komunikaty o błędach różnią się od tego, czego brakuje, a odpowiedzi w większości sugerują alternatywne trasy, takie jak używanie nowszej wersji emacsa.

- kod -

(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

Może to pomóc: (Emacs 24.3.1): loop to alias dla 'cl-loop 'w' cl.el'. I cl-loop jest makro Lisp w 'cl-macs.el '. Wykonaj pętlę C-h f. – aartist

Odpowiedz

9

Pakiet cl-lib został wprowadzony w Emacs 24.3 i zapewnia szereg Common Lisp wyposażony, wszystkie z prefiksem cl-. Wcześniej jedynym sposobem korzystania z tych funkcji było wymaganie biblioteki cl i używanie niepodpisanych nazw, np. loop zamiast cl-loop. Jednak było to odradzane ze względu na możliwość konfliktów nazw i zwykle zaleca się używanie prefiksowanych nazw, jeśli to możliwe.

Ponieważ używasz "poprawny" sposób Emacs 24.3, aby rozwiązać ten problem byłoby zastąpienie loop z cl-loop i return z 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))) 

(nie trzeba (require 'cl-lib), ponieważ cl-loop i cl-return są ładowane automatycznie.)

Alternatywnie można dodać (require 'cl), aby uzyskać dostęp do nieprecyzyjnych nazw i pozostawić kod w niezmienionej postaci. Będzie to również działać na wcześniejszych wersjach Emacsa.


nie mogę zauważyć, że ta funkcja może być napisany bardziej zwięźle:

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

Ten sam problem o cl-every Plus cl-lib vs every Plus cl dotyczy.

+0

Musiałem wymagać cl-lib, aby uzyskać cl-every do pracy w emacs 24.5.1 –

Powiązane problemy