2012-06-04 11 views
7

हाथ में समस्या यह है कि जब मैं lein run के साथ अपना प्रोग्राम चलाता हूं तो यह (read-line) भाग में आता है और मैं इससे बाहर नहीं निकल सकता, जिसका अर्थ है: रीड-लाइन कभी वापस नहीं आती है। स्क्रीन पर स्ट्रिंग:लीन रन का उपयोग करके ENTER को मारने के बाद रीड-लाइन क्यों नहीं लौटाता है (लटकने जैसा लगता है), लेकिन लीन प्रतिलिपि के साथ काम करता है?

(def command (atom "")) 

(defn print-prompt [] 
    (print "prompt> ") 
    (flush) 
) 

(defn ask-for-input [] 
    (print-prompt) 
    (let [x (str (read-line))] 
     (println (str "User input: " x)) 
     (reset! command x) 
    ) 
) 

मैं "उपयोगकर्ता इनपुट" कभी नहीं:

यहाँ प्रासंगिक कोड है। अजीब हिस्सा है, अगर मैं lein repl चलाने के लिए और फोन (ask-for-input) तो इसे सही ढंग से काम करता है: एस

+0

क्या है आदेश:

(ns repl-test.core (:gen-class) (:use clojure.contrib.command-line) (:require [clojure.contrib.string :as cstr]) (:require [clojure.contrib.trace :as ctr]) (:require [clojure.string :as sstr]) (:use clojure-csv.core)) 

और यहाँ project.clj फ़ाइल है? क्या आप अपनी मूल पोस्ट को संपादित करने और उसमें डालने पर विचार करेंगे? मैं अपना कोड बनाने की कोशिश कर रहा हूं और इसे देख रहा हूं। मुझे लगता है कि मुझे पता है कि यह क्या है, लेकिन इसे देखना अच्छा लगेगा। धन्यवाद। – octopusgrabbus

+0

@ ऑक्टोपसग्रैबस वहां, मैंने लापता लाइन को जोड़ा। – Deleteman

+0

लीन प्रतिलिपि पर, आप इसे कैसे कहते हैं? मैंने अभी प्रवेश किया (इनपुट के लिए पूछें)। बेशक, मेरे पास एक परियोजना की तरह मेरा क्षेत्र स्थापित है। मैं एक संपादन के रूप में अपने उत्तर में प्रोजेक्ट और स्रोत शीर्षलेख पोस्ट करूंगा। – octopusgrabbus

उत्तर

12

lein ट्रैम्पोलिन रन की कोशिश करें, यह काम करता है।

प्रश्न::

निम्नलिखित leiningen पूछे जाने वाले प्रश्न से है मैं अपने प्रोजेक्ट के अंदर stdin के लिए पहुँच नहीं है।

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

+0

हां यह करता है! अब आप समझाने की देखभाल करेंगे कि वह क्यों है? :) – Deleteman

+0

मेरा अनुमान है कि लीन ट्रैम्पोलिन रन काम करता है, क्योंकि डेटा फ़्लश हो रहा है। – octopusgrabbus

+0

संपादन के लिए धन्यवाद! मैं फिर से वोट दूंगा, लेकिन मैं नहीं कर सकता :( – Deleteman

0

मैंने आपके स्रोत कोड की कोशिश की, लेकिन फ्लश को छोड़ दिया। यह एक समस्या के बिना काम किया। क्लोजर का आप किस संस्करण का उपयोग कर रहे हैं? मैंने क्लोजर 1.3 के साथ निम्न कोड का प्रयास किया।

(def command (atom 0)) 

(defn print-prompt [] 
    (print "prompt> ") 
) 

(defn ask-for-input 
    [] 
    (print-prompt) 
    (let [x (str (read-line))] 
     (println (str "User input: " x)) 
     (reset! command x) 
    )) 

संपादित करें: मैं अपने कार्यों है कि मैं नकल की और साथ परीक्षण में से एक को बदल दिया है, और यह स्टैंडअलोन और lein रन के साथ अब काम करता है। आपके मूल उदाहरण में आपने (फ्लश) किया था।

(defn print-prompt [] 
    (print "prompt> ") 
    (flush) 
) 

मैं क्या जुटाने सकते हैं, println एक फ्लश का कारण बनता है, प्रिंट नहीं करता है, और आप प्रिंट के बाद एक फ्लश की जरूरत है।

यदि मैं सहायता की हो तो मैं यह जानकारी जोड़ रहा हूं। मेरे पास क्लोजर प्रोजेक्ट है जिसे कॉपी-टेस्ट कहा जाता है। यहां मेरी प्रति-परीक्षण प्रोजेक्ट की core.clj फ़ाइल हैडर है। आपका स्रोत, पहले से पोस्ट किया गया है, इस फ़ाइल में कुछ अन्य कार्यों के साथ है, जो आपकी पोस्ट से संबंधित नहीं है।

(defproject repl-test "0.0.1-SNAPSHOT" 
    :description "TODO: add summary of your project" 
    :dependencies [[org.clojure/clojure "1.3.0"] 
       [org.clojure/clojure-contrib "1.2.0"] 
       [clojure-csv/clojure-csv "1.2.4"] 
       [org.clojure/tools.cli "0.1.0"] 
       [clj-http "0.1.3"]] 
    :aot [repl-test.core] 
    :main repl-test.core) 
+0

मैं 1.3 का उपयोग कर रहा था और यह देखने के लिए 1.4 पर स्विच किया गया था कि यह मदद करेगा, लेकिन ऐसा नहीं हुआ। – Deleteman

+0

मेरी प्रोजेक्ट और core.clj शीर्षलेख जोड़ें। – octopusgrabbus

+0

वही सौदा, याद रखें कि रेप्ल पर यह काम करता है, अगर मैं 'लीन प्रतिलिपि' करता हूं और फिर '(-माइन)' कॉल करता हूं, तो प्रोग्राम सही तरीके से काम करता है, लेकिन अगर मैं इसे 'लीन रन' के साथ चलाता हूं तो रीड-लाइन कभी वापस नहीं आती है। बीटीडब्ल्यू मेरा कॉर्ड ट्रैम्पोलिन विकल्प के साथ सही ढंग से काम कर रहा है .. क्या आपको पता है क्यों? – Deleteman