2015-06-15 7 views
5

मैं emacs init.el (Emacs 24.3) में संकुल लोड करने पर परीक्षण कर रहा हूं। पैकेजों को स्वचालित रूप से लोड करने के लिए के लेखक द्वारा मैंने a blog का पालन किया, और कोड को नीचे init.el में नीचे कॉपी किया।emacs: प्रतीक की फ़ंक्शन परिभाषा शून्य है: लूप

Symbol's function definition is void: loop 

किसी कृपया समझा सकते हैं कि कैसे कोड तय करने के लिए: हालांकि, मैं loop समारोह/प्रतीक, जो कहते हैं के बारे में एक त्रुटि संदेश मिला?

मैंने इंटरनेट पर चारों ओर खोज की है, और ऐसा लगता है कि loopcl-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। लेकिन त्रुटि संदेश क्या गुम हैं, इस पर अलग हैं, और उत्तर ज्यादातर वैकल्पिक मार्गों का सुझाव देते हैं, जैसे एमएक्स के नए संस्करण का उपयोग करना।

- कोड -

(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): लूप 'cl.el 'में' cl-loop 'के लिए उपनाम है। और सीएल-लूप 'cl-macs.el 'में एक लिस्प मैक्रो है। सी-एच एफ पाश करो। – aartist

उत्तर

9

cl-lib पैकेज Emacs 24.3 में पेश किया गया था, और कॉमन लिस्प के एक नंबर की सुविधा प्रदान करता है, cl- उपसर्ग के साथ सभी। इससे पहले, उन सुविधाओं का उपयोग करने का एकमात्र तरीका cl लाइब्रेरी की आवश्यकता थी, और अपरिवर्तित नामों का उपयोग करना, उदा। cl-loop के बजाय। हालांकि, यह नाम विवादों की संभावना के कारण निराश था, और यदि संभव हो तो इसे आमतौर पर उपसर्ग नामों का उपयोग करने की अनुशंसा की जाती है।

आप Emacs 24.3, "सही" जिस तरह से उपयोग कर रहे हैं के बाद से ठीक करने के लिए इस cl-return साथ cl-loop और return साथ 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-loop और cl-return autoloaded हैं।)

वैकल्पिक रूप से, आप अपरिवर्तित नामों तक पहुंच प्राप्त करने के लिए (require 'cl) जोड़ सकते हैं, और कोड को छोड़ दें। यह पहले Emacs संस्करणों पर भी काम करेगा।


मैं देख कि इस समारोह अधिक संक्षेप लिखा जा सकता है मदद नहीं कर सकता:

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

एक ही मुद्दा cl-every प्लस cl-lib के बारे में बनाम every प्लस cl लागू होता है।

+0

मुझे एएमएक्स 24.5.1 में काम करने के लिए प्रत्येक को क्ल-लिब की आवश्यकता थी –

संबंधित मुद्दे