एक कमांड लाइन इंटरफ़ेस के साथ एक क्लोजर ऐप का निर्माण?


79

मैंने अभी w / Clojure (रूबी से आना) शुरू किया था और मैं कमांड-लाइन इंटरफ़ेस के साथ एक छोटा ऐप बनाना चाहूंगा। मैं एक सीएल को इनपुट / आउटपुट कैसे संभाल सकता हूं?

मैंने देखा कि एक clojure.contrib.command- लाइन है, लेकिन प्रलेखन पतला है।

http://github.com/richhickey/clojure-contrib/blob/ffa868411cda6c617105b52b4f6f9e0f37ee8c24/src/clobure/contrib/command_line.clj


9
ध्यान रखें कि यदि आपका ऐप अक्सर चलाया जाता है, तो आप हर बार जेवीएम स्टार्टअप लागत का भुगतान करेंगे।
स्टुअर्ट सिएरा

जवाबों:


120

यहाँ इसके with-command-lineमैक्रो का उपयोग करने का एक उदाहरण है । निम्न कोड एक मुख्य विधि के साथ एक तुच्छ वर्ग को निर्दिष्ट करता है जो कुछ भी नहीं करता है लेकिन इसके कमांड लाइन तर्कों के मूल्यों को प्रिंट करता है।

(ns cmd-line-demo
  (:gen-class)
  (:use clojure.contrib.command-line))

(defn -main [& args]
  (with-command-line args
      "Command line demo"
      [[foo "This is the description for foo" 1]
       [bar "This is the description for bar" 2]
       [boolean? b? "This is a boolean flag."]
       remaining]
    (println "foo: " foo)
    (println "bar: " bar)
    (println "boolean?: " boolean?)
    (println "remaining: " remaining)))

REPL पर कक्षा संकलित करें:

user> (compile 'cmd-line-demo)
cmd-line-demo

उदाहरण उपयोग

1) बिना कमांड लाइन के तर्कों के साथ प्रदर्शन करने से मदद की जानकारी प्रदर्शित होगी। मदद की जानकारी भी साथ प्रदर्शित किया जा सकता --helpया -hझंडे। ध्यान दें कि सहायता जानकारी स्वचालित रूप से आपके cmdspec से उत्पन्न होती है।

$ java -classpath . cmd_line_demo
Command line demo
Options
  --foo <arg>    This is the description for foo  [default 1]
  --bar <arg>    This is the description for bar  [default 2]
  --boolean, -b  This is a boolean flag.  

2) अनिर्दिष्ट तर्क cmdspec बाइंडिंग में निर्दिष्ट डिफ़ॉल्ट मान प्राप्त करते हैं। उदाहरण के लिए, barका डिफ़ॉल्ट मान है 2

$ java -classpath . cmd_line_demo --foo "changed value"
foo:  changed value
bar:  2
boolean?:  nil
remaining:  []

3) बुलियन के झंडे को प्रत्यय द्वारा दर्शाया गया है "?" cmdspec में। ध्यान दें कि ध्वज में "शामिल नहीं है ?" इसके नाम के भाग के रूप में।

$ java -classpath . cmd_line_demo -boolean
foo:  1
bar:  2
boolean?:  true
remaining:  []

4) यह भी ध्यान दें कि आप cmdspec में कई प्रतीकों को निर्दिष्ट करके ध्वज उपनाम निर्दिष्ट कर सकते हैं। मैंने झंडे boolean?और b?झंडों के साथ ऐसा किया है ।

5) अंत में, मैंने निर्दिष्ट किया है कि remainingसंबद्ध झंडे के बिना सभी शेष तर्कों को कैप्चर करें।

$ java -classpath . cmd_line_demo -foo test file1 file2 file3
foo:  test
bar:  2
boolean?:  nil
remaining:  [file1 file2 file3]

बहुत बढ़िया था कि मैं क्या देख रहा था। बहुत गहन। मुझे उम्मीद है कि यह Google :)
dMix

1
यह वास्तव में अस्तित्व में इसका सबसे भयानक उदाहरण है।
एलेक्स मिलर

9
क्लोजर 1.3 के लिए, लोगों को संभवतः टूल.कली (नई कंट्रीब) का उपयोग शुरू करना चाहिए। देखें dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go और github.com/clojure/tools.cli
semperos

33

पुरानी clojure.contrib.command- लाइन को tools.cli से बदल दिया गया है।

https://github.com/clojure/tools.cli

tools.cli को क्लियरगन कहा जाता था। नीचे दो ब्लॉग पोस्ट दिए गए हैं, जो टूल.ली का उपयोग करने का उदाहरण देते हैं (सरल किसी भी संदर्भ को टूलगन के साथ हटा दें। पोस्ट आउट ऑफ डेट हैं)।

यह पुराने clojure.contrib.command- लाइन सहित कुछ तरीकों के तरीकों को दिखाता है

मूल लेखक द्वारा क्लेरगॉन पर केंद्रित पोस्ट


12

मैं जोड़ना चाहूंगा कि आप कर सकते हैं

(apply -main *command-line-args*)

नीचे (defn -main ...)यह व्याख्या किए गए मोड में काम करने के लिए।


7

सवाल उठाए जाने के लंबे समय बाद मैं docoptपुस्तकालयों का उपयोग करने का सुझाव दे सकता हूं जब यह सीएलआई इंटरफ़ेस का निर्माण करने की बात आती है। वहाँ Clojure के लिए एक है -docopt.clj

docopt सम्मेलनों पर आधारित है जो दशकों से मदद संदेशों और प्रोग्राम इंटरफ़ेस विवरण के लिए मैन पेज में उपयोग किए जाते हैं। Docopt में इंटरफ़ेस विवरण एक ऐसा मदद संदेश है, लेकिन औपचारिक रूप से

तो आप घोषणा कर सकते हैं अपने इंटरफ़ेस और इसे उसी समय में प्रलेखित कर सकते हैं - जो अद्भुत और करने में आसान है।

अधिक जानकारी के लिए मैं http://docopt.org/ की जांच करने की सलाह देता हूं

इसके अलावा अपने इंटरफ़ेस की जाँच करने के लिए एक ऑनलाइन ऐप है http://try.docopt.org/

और अंत में यहाँ मेरा उदाहरण है कि क्लोजर लिब का उपयोग कैसे किया जा सकता है।


1

शायद जार की कोशिश करो। Jark लगातार JVM पर क्लोजर प्रोग्राम चलाने का एक उपकरण है। इसकी कुछ उपयोगी कमांड-लाइन उपयोगिताओं हैं।

https://clojars.org/jark

jark ns load file.clj
jark <namespace>.<function> <args>
jark if cli-json <namespace><function> args 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.