2015-06-15 19 views
5

Sto testando il caricamento dei pacchetti in emacs init.el (Emacs 24.3). Ho seguito a blog dall'autore di emacs prelude per caricare automaticamente i pacchetti e copiato il codice nel mio init.el come nella parte inferiore. Tuttavia, ho ricevuto un messaggio di errore circa la funzione di loop/simbolo, che dice:emacs: la definizione della funzione del simbolo è nulla: loop

Symbol's function definition is void: loop 

Qualcuno può spiegare come risolvere il codice?

Ho cercato su Internet, e sembra che loop sia una macro in cl-lib. La mia ipotesi è che la definizione di loop sia mancante e ho tentato di risolvere il problema aggiungendo (require 'cl-lib), come mostrato nel codice, ma l'errore rimane. Esistono altre domande SO su messaggi di errore simili, ad esempio ELisp: cl-loop for "Symbol's value as variable is void", Symbol's function definition is void: declare-function. Ma i messaggi di errore sono diversi su ciò che manca e le risposte suggeriscono per lo più percorsi alternativi, come l'uso della versione più recente di emacs.

- codice -

(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

Ciò può aiutare: (Emacs 24.3.1): loop è un alias per 'cl-loop 'in' cl.el'. E cl-loop è una macro Lisp in 'cl-macs.el '. Fai un ciclo C-h f. – aartist

risposta

9

Il pacchetto cl-lib è stato introdotto in Emacs 24.3, e fornisce una serie di Common Lisp caratteristiche, il tutto con il prefisso cl-. Prima di ciò, l'unico modo per utilizzare queste funzionalità era richiedere la libreria cl e utilizzare nomi non prefissati, ad es. loop anziché cl-loop. Tuttavia, questo è stato scoraggiato a causa della possibilità di conflitti di nome, e di solito è consigliabile utilizzare i nomi con prefisso, se possibile.

Dal momento che si sta utilizzando Emacs 24.3, il modo "corretto" per risolvere questo problema sarebbe quella di sostituire loop con cl-loop e return con 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))) 

(Non è necessario (require 'cl-lib), perché cl-loop e cl-return sono caricati automaticamente.)

In alternativa, è possibile aggiungere (require 'cl) per ottenere l'accesso ai nomi non prefissati e lasciare il codice così com'è. Questo funzionerà anche su versioni precedenti di Emacs.


non posso fare a meno di notare che questa funzione potrebbe essere scritto più brevemente:

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

Lo stesso problema su cl-every più cl-lib vs every più cl applica.

+0

Ho dovuto richiedere cl-lib per ottenere cl-every per lavorare in emacs 24.5.1 –

Problemi correlati