कृपया नेस्टेड डीईएफ़ के प्रयोग नहीं करते। ऐसा नहीं करता है, जो आपको लगता है वह करता है। डीफ हमेशा वैश्विक है! स्थानीय लोगों के लिए उपयोग करते हैं। जबकि लाइब्रेरी फ़ंक्शंस जानना अच्छा होता है, यहां एक संस्करण सामान्य रूप से कार्यात्मक प्रोग्रामिंग की कुछ विशेषताओं और विशेष रूप से क्लोजर को व्यवस्थित करता है।
(import 'java.io.FileWriter 'java.io.FileReader 'java.io.BufferedReader)
(defn translate-coords
डॉकस्ट्रिंग को आरईपीएल में (डॉक्टर अनुवाद-कॉर्ड) के माध्यम से पूछताछ की जा सकती है। काम करता है उदाहरण के लिए। सभी मूल कार्यों के लिए। तो एक की आपूर्ति करना एक अच्छा विचार है।
"Reads coordinates from infile, translates them with the given
translator and writes the result to outfile."
अनुवादक एक (शायद अज्ञात) फ़ंक्शन है जो आस-पास के बॉयलरप्लेट से अनुवाद निकालता है। इसलिए हम विभिन्न कार्यों के नियमों के साथ इस कार्यों का पुन: उपयोग कर सकते हैं। यहां संकेत संकेत निर्माता के लिए प्रतिबिंब से बचें।
[translator #^String infile #^String outfile]
फ़ाइलों को खोलें। खुली खुली देखभाल करेगा, जब उसके शरीर को छोड़ दिया जाता है तो फाइलें बंद होती हैं। सामान्य के माध्यम से "नीचे ड्रॉप" या इसे एक थका हुआ अपवाद के माध्यम से बनें।
(with-open [in (BufferedReader. (FileReader. infile))
out (FileWriter. outfile)]
हम आउटपुट फ़ाइल के लिए अस्थायी रूप से *out*
धारा बाँध। तो बाध्यकारी के अंदर कोई भी प्रिंट फ़ाइल को प्रिंट करेगा।
(binding [*out* out]
map
साधन: seq लेने के लिए और हर तत्व को दिया समारोह लागू करते हैं और परिणामों की seq लौट आते हैं। #()
एक अज्ञात फ़ंक्शन के लिए एक संक्षिप्त हाथ नोटेशन है। यह एक तर्क लेता है, जो %
पर भरा हुआ है। doseq
मूल रूप से इनपुट पर एक लूप है। चूंकि हम साइड इफेक्ट्स (अर्थात् फाइल को प्रिंट करना) के लिए करते हैं, doseq
सही निर्माण है। अंगूठे का नियम: map
: आलसी => परिणामस्वरूप, doseq
: eager => दुष्प्रभावों के लिए।
(doseq [coords (map #(.split % ",") (line-seq in))]
println
पंक्ति के अंत में \n
के लिए ख्याल रखता है। interpose
सीईसी लेता है और इसके तत्वों के बीच पहला तर्क (हमारे मामले में "") जोड़ता है। (apply str [1 2 3])
(str 1 2 3)
के बराबर है और गतिशील रूप से फ़ंक्शन कॉल बनाने के लिए उपयोगी है। ->>
क्लोजर में अपेक्षाकृत नया मैक्रो है, जो पठनीयता के साथ थोड़ा सा मदद करता है। इसका मतलब है "पहला तर्क लें और इसे फंक्शन कॉल में अंतिम आइटम के रूप में जोड़ें"। दिया गया ->>
बराबर है: (println (apply str (interpose " " (translator coords))))
। (संपादित करें: एक और ध्यान दें: के बाद से विभाजक \space
है लिखते हैं, हम यहाँ कर सकते थे बस के रूप में अच्छी तरह से (apply println (translator coords))
, लेकिन interpose
संस्करण के रूप में हम अनुवादक समारोह के साथ किया था भी विभाजक parametrize है, जबकि लघु संस्करण \space
hardwire हैं अनुमति देता है।)
(->> (translator coords)
(interpose " ")
(apply str)
println)))))
(defn survey->cartography-format
"Translate coords in survey format to cartography format."
यहां हम विनाशकारी का उपयोग करते हैं (डबल [[]]
नोट करें)। इसका मतलब है कि समारोह के लिए तर्क कुछ ऐसा है जिसे एक सीक में बदल दिया जा सकता है, उदाहरण के लिए। एक वेक्टर या एक सूची। पहले तत्व को y
पर बांधें, दूसरा x
और इसी तरह से।
[[y x z p]]
[p x y z])
(translate-coords survey->cartography-format "survey_coords.txt" "cartography_coords.txt")
यहां भी कम अस्थिर:
(import 'java.io.FileWriter 'java.io.FileReader 'java.io.BufferedReader)
(defn translate-coords
"Reads coordinates from infile, translates them with the given
translator and writes the result to outfile."
[translator #^String infile #^String outfile]
(with-open [in (BufferedReader. (FileReader. infile))
out (FileWriter. outfile)]
(binding [*out* out]
(doseq [coords (map #(.split % ",") (line-seq in))]
(->> (translator coords)
(interpose " ")
(apply str)
println)))))
(defn survey->cartography-format
"Translate coords in survey format to cartography format."
[[y x z p]]
[p x y z])
(translate-coords survey->cartography-format "survey_coords.txt" "cartography_coords.txt")
आशा इस मदद करता है।
संपादित करें: सीएसवी पढ़ने के लिए शायद आप OpenCSV की तरह कुछ चाहते हैं।
'मेरा ($ x, $ y, $ z, $ p) = विभाजन /, /;' –
अच्छा बिंदु - TIMTOWTDI। धन्यवाद। –