2014-05-18 8 views
8

मैं सिर्फ lein का उपयोग कर मेरी पहली clojure परियोजना पर शुरू कर दिया असमर्थ चलाने के लिए, यहाँ कोड:Clojure: लें हल करने प्रतीक

(ns fileops.core 
    (:use 
    [clojure.core :only (slurp)] 
    [clojure-csv.core :only (parse-csv)] 
    [fileops.core])) 

(defn -main 
    "I don't do a whole lot ... yet." 
    [& args] 
    (read-file "sample.csv")) 

(defn read-file 
    "open and read the csv file" 
    [fname] 
    (with-open [file (clojure.java.io/reader fname)] 
    (parse-csv (slurp fname)))) 

मैं इस का उपयोग करते हुए "lein रन" भागने की कोशिश की, लेकिन मैं यह त्रुटि मिलती रहती:

Caused by: java.lang.RuntimeException: Unable to resolve symbol: read-file in this context 
    at clojure.lang.Util.runtimeException(Util.java:219) 
    at clojure.lang.Compiler.resolveIn(Compiler.java:6874) 
    at clojure.lang.Compiler.resolve(Compiler.java:6818) 
    at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779) 
    at clojure.lang.Compiler.analyze(Compiler.java:6343) 
    ... 52 more 

मैं क्या गलत कर रहा हूं?

+4

-पढ़ने के लिए फ़ाइल अपने स्रोत में मुख्य से पहले किया जाना चाहिए। –

+0

@DiegoBasch आप एक जीवन बचतकर्ता हैं। मैं क्लोजर के लिए नया हूं और मैंने यह पता लगाने की कोशिश में बहुत अधिक समय बिताया कि मुझे गलत संदर्भ में मेरे फ़ंक्शन के बारे में त्रुटि क्यों मिली। यह था ... यह पूरे समय था। महान पद। –

उत्तर

9

आप clojure कोर से केवल slurp का इस्तेमाल किया है, जिसका अर्थ है कि हर दूसरे मुख्य कार्य अब, आप के लिए उपलब्ध नहीं :) अपने ns:use के बजाय :require उपयोग करने के लिए परिवर्तित करने का प्रयास है के रूप में इस अधिक मुहावरेदार है।

ध्यान देने योग्य एक बात यह है कि आदेश क्लोजर में महत्वपूर्ण है, इसलिए यदि आप अपनी फ़ाइल के शीर्ष पर कोई फ़ंक्शन घोषित नहीं करते हैं, जैसे कि सी और कुछ अन्य भाषाओं में, पहले के फ़ंक्शन संदर्भ नहीं दे पाएंगे उनको। यही कारण है कि आपकी त्रुटि पहले हो रही थी और इसलिए मैं नीचे अपने -main फ़ंक्शन को परिभाषित करना चाहता हूं। यह शैली का मामला है।

एक और बात यह है कि आपका -main फ़ंक्शन अभी परिवर्तनीय तर्क ले रहा है और उनका उपयोग नहीं कर रहा है। क्लोजर में यह उपयोग किए जाने वाले पैरामीटर को संदर्भित करने के लिए _ का उपयोग करने के लिए मूर्खतापूर्ण है। जब आप अनावश्यक तर्कों में गुजरते हैं, तो त्रुटि संदेश से बचने के लिए आप & _ का उपयोग कर सकते हैं, लेकिन मेरे पास शुरुआत से ही -इन फ़ंक्शन पैरामीटर रहित होगा। ऐसा इसलिए है क्योंकि जब आप प्रोग्राम चलाते हैं तो मुख्य को कुछ भी प्रदान करने की आवश्यकता नहीं होती है, और त्रुटियां डीबगिंग को आसान बनाती हैं। यह जानना अच्छा होता है कि क्या उपयोग किया जा रहा है और कहां है। sample.csv फ़ाइल पहले से ही प्रदान की गई है और इसमें read-file है, इसलिए प्रोग्राम को चलाना चाहिए यदि आपका read-file फ़ंक्शन सही है और sample.csv फ़ाइल उचित स्थान पर है।

अपने -main फ़ंक्शन के संबंध में, यह देखने के लिए अच्छा परीक्षण करना अच्छा होगा कि यह चलाने पर ठीक से निष्पादित हो या नहीं, इसलिए मैंने इसे आपके कंसोल पर सीएसवी फ़ाइल की सामग्री को मुद्रित करने के लिए बदल दिया। फ़ाइल से प्रिंट करने का यह तरीका अपने अधिकार में अध्ययन करने योग्य और योग्य है।

अंत में, सुनिश्चित करें कि आप clojure-csv.core को अपने project.clj फ़ाइल में शामिल करें।

core.clj:

(ns fileops.core 
    (:require 
    [clojure-csv.core :refer [parse-csv]])) 

(defn read-file 
    "open and read the csv file" 
    [fname] 
    (with-open [file (clojure.java.io/reader fname)] 
    (parse-csv (slurp fname)))) 

(defn -main [] 
     (println (clojure.string/join "\n" (read-file "resources/test.csv")))) 

project.clj: जैसा कि ऊपर दिखाया, मुख्य:

... 

:dependencies [[org.clojure/clojure "1.5.1"] 
       [clojure-csv/clojure-csv "2.0.1"] 
       ...] 
:main fileops.core 

आप के रूप fileops.core घोषित करने के लिए की जरूरत है। यह Leiningen को बताता है कि जब आप lein run दर्ज करते हैं तो निष्पादित करने के लिए क्या कार्य करता है। बहुत महत्वपूर्ण और मुश्किल सामान।

तो अब सुनिश्चित करें कि आप अपनी परियोजना निर्देशिका की जड़ में और टर्मिनल पर कर रहे हैं, तो निम्न चलाएँ:

lein clean 
lein deps 
lein run 

गुड लक!

अतिरिक्त पठन:

8th light blog on name-spaces

flying machine studios explanation of lein run

+1

यह एसओ पर मेरा पहला स्वीकार्य उत्तर है। आपका बहुत बहुत धन्यवाद! :) – kurofune