Clojure के लिए Emacs/Swank/Paredit के लिए एक सभ्य ट्यूटोरियल




(3)

मैं Clojure / लिस्प पर काम करने के लिए Emacs पर जा रहा हूँ। Emacs पर निम्नलिखित करने में सक्षम होने के लिए मुझे आवश्यक सभी जानकारी क्या है?

  1. संबंधित मिलान / संबंधित बंद ब्रैकेट की पीढ़ी
  2. ऑटोइंडेंट लिस्प / क्लोजर शैली, सी ++ / जावा शैली नहीं
  3. वाक्य - विन्यास पर प्रकाश डालना
  4. REPL
  5. फ़ाइल से कोड का एक हिस्सा आरईपीएल में लोड करने और इसका मूल्यांकन करने में सक्षम होने के लिए।

यह बहुत अच्छा होगा अगर मैं Emacs पर चीजों को सेट करने के बाद इन चीजों को प्राप्त करने के लिए आदेशों की सूची भी प्राप्त कर सकता हूं।


[गैर-लेखक से संपादित करें: यह 2010 से है, और प्रक्रिया मई 2011 से काफी सरल हो गई है। मैं इस जवाब में फरवरी 2012 तक अपने सेटअप नोट्स के साथ एक पोस्ट जोड़ूंगा।]

आपको कुछ टुकड़ों को एक साथ रखना होगा: Emacs, SLIME (जो क्लोजर के साथ पूरी तरह से अच्छी तरह से काम करता है - स्वैंक-क्लोजर देखें), स्वैंक-क्लोजर (एसएलईएमई के सर्वर समकक्ष का क्लोजर कार्यान्वयन), क्लोजर-मोड, पेरेडिट और, बेशक, क्लोजर जार एक शुरुआत के लिए, तो शायद कुछ अतिरिक्त जिनमें लीनिंगन शायद सबसे उल्लेखनीय होगा। एक बार जब आप इसे सेट अप कर लेंगे, तो आपके पास - Emacs के भीतर - प्रश्न में उल्लिखित सभी वर्कफ़्लो / संपादन सुविधाएं होंगी।

बुनियादी ढांचा:

निम्नलिखित महान ट्यूटोरियल हैं जो वर्णन करते हैं कि यह सब कैसे सेट करें; वेब पर और भी कुछ है, लेकिन कुछ अन्य पुराने हैं, जबकि ये दोनों अभी के लिए ठीक लगते हैं:

  1. जिसमें फिल हैगलबर्ग के ब्लॉग पर क्लोजर लेखक पद से संबंधित व्यापार की चालें पाई जाती हैं ; फिल ने स्वैंक-क्लोजर और क्लोजर-मोड बनाए रखा है, साथ ही साथ एमेक्स स्टार्टर किट नामक पैकेज भी है, जो कि इमाक्स की दुनिया के लिए कोई नया नवागंतुक है, जिस पर ध्यान देने की सलाह दी जाएगी। प्रतीत होता है कि इन निर्देशों को बुनियादी ढांचे में हालिया परिवर्तनों के साथ अद्यतित किया गया है; संदेह के मामले में, क्लोजर के Google समूह पर अतिरिक्त जानकारी देखें।

  2. Incanter परियोजना के ब्लॉग पर क्लोजर, Incanter, Emacs, कीचड़, स्वैंक, और Paredit पोस्ट की स्थापना। Incanter क्लोजर में एम्बेडेड सांख्यिकीय गणना के लिए आर-जैसे डीएसएल प्रदान करने वाला एक आकर्षक पैकेज है। यह पोस्ट उपयोगी होगा भले ही आप उपयोग करने की योजना नहीं बनाते - या यहां तक ​​कि इंस्टॉल - इंकेंटर।

इसे सब काम पर डाल देना:

एक बार जब आप इन सभी चीजों को स्थापित कर लेंगे, तो आप इसे तुरंत इस्तेमाल करने का प्रयास कर सकते हैं, लेकिन मैं दृढ़ता से आपको निम्न कार्य करने की सलाह दूंगा:

  1. एसएलईएमई के मैनुअल पर एक नज़र डालें - यह स्रोतों में शामिल है और वास्तव में बहुत पठनीय है। इसके अलावा, बिल्कुल कोई कारण नहीं है कि आपको पूरे 50-पेज राक्षस मैनुअल को क्यों पढ़ना चाहिए; यह देखने के लिए कि क्या विशेषताएं उपलब्ध हैं, बस एक नज़र डालें।

    नोट: नवीनतम अपस्ट्रीम स्रोतों में पाया गया एसएलआईएमई की ऑटोोडोक सुविधा स्वैंक-क्लोजर के साथ असंगत है - यदि आप ईएलपीए संस्करण का उपयोग करने के लिए फिल हैगलबर्ग की सिफारिश का पालन करते हैं तो यह समस्या तब नहीं आती है (स्पष्टीकरण के लिए उपर्युक्त ब्लॉग पोस्ट देखें) या बस ऑटोडोक बंद करें (जो चीजों की डिफ़ॉल्ट स्थिति है)। बाद के विकल्प में कुछ अतिरिक्त अपील है कि आप अभी भी सामान्य लिस्पी के साथ नवीनतम एसएलएमई का उपयोग कर सकते हैं, यदि आप इसका भी उपयोग करते हैं।

  2. पेरेडिट के लिए दस्तावेज़ों पर एक नज़र डालें। इसके बारे में जाने के दो तरीके हैं: (1) स्रोत को देखें - फ़ाइल के शीर्ष पर बड़ी संख्या में टिप्पणियां हैं जिनमें आपकी सभी आवश्यक जानकारी शामिल हैं; (2) Emacs में ch m टाइप करें जबकि पेरेडिट-मोड सक्रिय है - एक बफर वर्तमान प्रमुख मोड पर जानकारी के साथ पॉप अप करेगा, इसके बाद सभी सक्रिय मामूली मोडों पर जानकारी (पेरेडिट उन में से एक है)।

    अपडेट करें: मुझे फिल हैगेलबर्ग द्वारा पेरेडिट पर नोट्स का यह अच्छा सेट मिला है ... यह एक टेक्स्ट फ़ाइल का एक लिंक है, मुझे याद है कि इस जानकारी के साथ कहीं भी स्लाइड का एक अच्छा सेट देख रहा है, लेकिन अब यह नहीं लगता है । वैसे भी, यह एक अच्छा सारांश है कि यह कैसे काम करता है। निश्चित रूप से इसे देखें, मैं अब पेरेडिट के बिना नहीं रह सकता और इस फ़ाइल को इसका उपयोग करना शुरू करना बहुत आसान बनाना चाहिए, मुझे विश्वास है। :-)

  3. वास्तव में, च एम संयोजन आपको क्लोजर-मोड में एसएलईएमई आरईपीएल में सक्रिय सभी कीबाइंडिंग्स के बारे में बताएगा (आप संकलन के लिए वर्तमान बफर को भेजने के लिए सीसी सीके को याद रखना चाहते हैं) और वास्तव में किसी भी Emacs बफर में।

फ़ाइल से कोड लोड करने के लिए और उसके बाद REPL पर इसका प्रयोग करने के लिए: वर्तमान बफर को संकलित करने के लिए उपर्युक्त सीसी सीके संयोजन का use , फिर REPL पर इसके नामस्थान का use या इसकी require । अगला, प्रयोग दूर।

अंतिम नोट्स:

सभी क्लिकों से पहले कुछ समय के लिए चीजों को ट्विक करने के लिए तैयार रहें। इसमें बहुत सारे टूल शामिल हैं और उनकी बातचीत ज्यादातर काफी चिकनी होती है, लेकिन उस बिंदु पर नहीं, जहां यह मानना ​​सुरक्षित होगा कि आपको प्रारंभ में कुछ समायोजन नहीं करना पड़ेगा।

आखिरकार, यहां कुछ कोड है जो मैं .emacs में रखता हूं जो आपको कहीं और नहीं मिलेगा (हालांकि यह फिल हैगलबर्ग द्वारा कूल फ़ंक्शन पर आधारित है)। मैं lein swank (Leiningen की कूलर सुविधाओं में से एक) के साथ अपने swank उदाहरण शुरू करने के बीच वैकल्पिक और Emacs के भीतर से पूरी चीज शुरू करने के लिए नीचे मिले clojure-project समारोह का उपयोग कर वैकल्पिक। मैंने बाद में यह सुनिश्चित करने के लिए अपना सर्वश्रेष्ठ प्रयास किया है कि lein swank द्वारा प्रदान किए गए पर्यावरण को निकटता से मिलान किया जाए। ओह, और यदि आप एक त्वरित और गंदे प्रयोग के लिए Emacs में एक आरईपीएल चाहते हैं, तो सही सेटअप के साथ आप सीधे एमएक्स कीचड़ का उपयोग करने में सक्षम होना चाहिए।

(setq clojure-project-extra-classpaths
      '(
        ; "deps/"
        "src/"
        "classes/"
        "test/"
        ))

(setq clojure-project-jar-classpaths
      '(
        ; "deps/"
        "lib/"
        ))

(defun find-clojure-project-jars (path)
  (apply #'append
         (mapcar (lambda (d)
                   (loop for jar in (remove-if (lambda (f) (member f '("." "..")))
                                               (directory-files d t))
                         collect jar into jars
                         finally return jars))
                 (remove-if-not #'file-exists-p
                                clojure-project-jar-classpaths))))

(defun find-clojure-jar (jars)
  (let ((candidates
         (remove-if-not
          (lambda (jar)
            (string-match-p "clojure\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
          jars)))
    (if candidates
        (car candidates)
      (expand-file-name "~/.clojure/clojure.jar"))))

(defun find-clojure-contrib-jar (jars)
  (let ((candidates
         (remove-if-not
          (lambda (jar)
            (string-match-p "clojure-contrib\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
          jars)))
    (if candidates
        (car candidates)
      (expand-file-name "~/.clojure/clojure-contrib.jar"))))

;;; original due to Phil Hagelberg
;;; (see `Best practices for Slime with Clojure' thread on Clojure Google Group)
(defun clojure-project (path)
  "Sets up classpaths for a clojure project and starts a new SLIME session.

   Kills existing SLIME session, if any."
  (interactive (list (ido-read-directory-name
                      "Project root:"
                      (locate-dominating-file default-directory "pom.xml"))))
  (when (get-buffer "*inferior-lisp*")
    (kill-buffer "*inferior-lisp*"))
  (cd path)
  ;; I'm not sure if I want to mkdir; doing that would be a problem
  ;; if I wanted to open e.g. clojure or clojure-contrib as a project
  ;; (both lack "deps/")
                                        ; (mapcar (lambda (d) (mkdir d t)) '("deps" "src" "classes" "test"))
  (let* ((jars (find-clojure-project-jars path))
         (clojure-jar (find-clojure-jar jars))
         (clojure-contrib-jar (find-clojure-contrib-jar jars)))
    (setq swank-clojure-binary nil
          ;; swank-clojure-jar-path (expand-file-name "~/.clojure/clojure.jar")
          swank-clojure-jar-path clojure-jar
          swank-clojure-extra-classpaths
          (cons clojure-contrib-jar
                (append (mapcar (lambda (d) (expand-file-name d path))
                                clojure-project-extra-classpaths)
                        (find-clojure-project-jars path)))
          swank-clojure-extra-vm-args
          (list (format "-Dclojure.compile.path=%s"
                        (expand-file-name "classes/" path)))
          slime-lisp-implementations
          (cons `(clojure ,(swank-clojure-cmd) :init swank-clojure-init)
                (remove-if #'(lambda (x) (eq (car x) 'clojure))
                           slime-lisp-implementations))))
  (slime))

एक और उत्कृष्ट ट्यूटोरियल है:

30 से 45 मिनट में किसी के पास स्क्रैच से सबकुछ सेटअप हो सकता है।

ट्यूटोरियल Emacs के किसी भी पूर्व ज्ञान (और क्लोजर भी - पहले पदों में क्लोजर के लिए एक अच्छा परिचय है) मानता है।


Emacs स्टार्टर किट Clojure के साथ शुरू करने के लिए महान समीक्षा मिली है:

अपने प्रश्न के केवल झुकाव का जवाब देने के लिए:

लीनिंगन सही वर्गपाथ के साथ झुकाव स्थापित करने और इसे Emacs से कनेक्ट करने का एक बहुत ही आसान तरीका है।

एक महान वीडियो यहां है: http://vimeo.com/channels/fulldisclojure#8934942 यहां एक project.clj फ़ाइल का एक उदाहरण है

(defproject project "0.1"
    :dependencies [[org.clojure/clojure
                      "1.1.0-master-SNAPSHOT"]
                   [org.clojure/clojure-contrib
                      "1.0-SNAPSHOT"]]
    :dev-dependencies [[leiningen/lein-swank "1.1.0"]]
    :main my.project.main)

तो भागो:

lein swank

और Emacs से:

 alt-x slime-connect




clojure