2015-06-15 13 views
5

Tôi đang thử nghiệm trên các gói tải trong emacs init.el (Emacs 24.3). Tôi đã theo dõi a blog bởi tác giả của emacs prelude để tự động tải các gói và sao chép mã đó vào số init.el của tôi ở dưới cùng. Tuy nhiên, tôi nhận được thông báo lỗi về chức năng/biểu tượng loop, có nội dung:emacs: Định nghĩa chức năng của biểu tượng bị vô hiệu: loop

Symbol's function definition is void: loop 

Ai đó có thể giải thích cách sửa mã?

Tôi đã tìm kiếm trên internet và có vẻ như là loop là macro trong cl-lib. Tôi đoán là định nghĩa cho thiếu loop và tôi đã cố khắc phục sự cố bằng cách thêm (require 'cl-lib), như được hiển thị trong mã, nhưng lỗi vẫn còn. Có các câu hỏi SO khác về thông báo lỗi tương tự, ví dụ: ELisp: cl-loop for "Symbol's value as variable is void", Symbol's function definition is void: declare-function. Nhưng các thông báo lỗi khác nhau về những gì còn thiếu, và câu trả lời chủ yếu đề xuất các tuyến đường thay thế, chẳng hạn như sử dụng phiên bản mới hơn của emacs.

- Mã -

(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

Điều này có thể giúp: (Emacs 24.3.1): vòng lặp là bí danh cho 'cl-loop 'trong' cl.el'. Và cl-loop là một macro Lisp trong 'cl-macs.el '. Thực hiện vòng lặp C-h f. – aartist

Trả lời

9

Gói cl-lib đã được giới thiệu trong Emacs 24,3, và cung cấp một số tính năng Common Lisp, tất cả với tiền tố cl-. Trước đó, cách duy nhất để sử dụng các tính năng đó là yêu cầu thư viện cl và sử dụng các tên không được cố định, ví dụ: loop thay vì cl-loop. Tuy nhiên, điều đó không được khuyến khích vì khả năng xung đột tên, và nó thường được khuyến khích sử dụng các tên được đặt trước nếu có thể.

Vì bạn đang sử dụng Emacs 24,3, "đúng" cách để sửa lỗi này sẽ được thay thế loop với cl-loopreturn với 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))) 

(Bạn không cần phải (require 'cl-lib), vì cl-loopcl-return được tự động tải.)

Hoặc, bạn có thể thêm (require 'cl) để có quyền truy cập vào các tên chưa được cố định và để nguyên mã như vậy. Điều này cũng sẽ hoạt động trên các phiên bản Emacs trước đó.


Tôi không thể giúp nhận thấy rằng chức năng này có thể được viết ngắn gọn hơn:

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

Cùng một vấn đề về cl-every cộng cl-lib vs every cộng cl áp dụng.

+0

Tôi đã yêu cầu cl-lib để có được cl-every để làm việc trong emacs 24.5.1 –

Các vấn đề liên quan