2011-10-10 11 views
5

के लिए प्रतीक्षा नहीं करता है मैं क्लोजर में एक टेक्स्ट गेम लिख रहा हूं। मैं चाहता हूं कि खिलाड़ी कंसोल पर लाइनों को टाइप करे, और गेम लाइन-दर-रेखा आधार पर प्रतिक्रिया दे।क्लोजर (रीड-लाइन) इनपुट

अनुसंधान ने मुझे दिखाया कि (read-line) क्लोजर में मानक इनपुट से टेक्स्ट लाइन प्राप्त करने का तरीका है, लेकिन यह मेरे लिए काम नहीं कर रहा है।

मैं एक ताजा Leiningen परियोजना में हूँ, और मैं केवल स्रोत फ़ाइल को project.clj इशारा करने के लिए एक :main खंड को शामिल किया है:

(ns textgame.core) 

(defn -main [& args] 
    (println "Entering -main") 
; (flush)      ;makes no difference if flush are commented out 
    (let [input (read-line)] 
    (println "ECHO:" input)) 
; (flush) 
    (println "Exiting -main")) 

lein run पैदावार का उपयोग कर:

Entering -main 
ECHO: nil 
Exiting -main 

दूसरे शब्दों में पढ़ने के लिए (read-line) के लिए कंसोल पर टेक्स्ट दर्ज करने का कोई अवसर नहीं है।

क्लोजर को अक्षरों और न्यूलाइन में प्रवेश करने और संबंधित स्ट्रिंग को वापस करने के लिए मुझे कैसे प्राप्त करना चाहिए?

(मैं सूक्ति टर्मिनल 2.32.1 उपयोग कर रहा हूँ लिनक्स टकसाल 11 पर, Leiningen जावा 1.6.0_26 जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वी एम, Clojure संस्करण 1.2.1 पर 1.6.1.1।)

अद्यतन : अगर मैं lein repl चलाता हूं, तो मैं (println (read-line)) कर सकता हूं, लेकिन जब मेरे पास -main फ़ंक्शन नहीं है और lein run का उपयोग करके चलाएं।

+0

[क्लोजर की (रीड-लाइन) रिटर्न की संभावित डुप्लिकेट शून्य; संकेत नहीं देता] (http: // stackoverflow।कॉम/प्रश्न/5861373/क्लोजर-रीड-लाइन-रिटर्न-नील-डू-नो-प्रॉम्प्ट) – amalloy

+0

@amalloy आपके द्वारा लिंक किए गए उत्तर में सबसे अच्छा अनुमान यह था कि यह स्वैंक-क्लोजर/एसएलईएमई के साथ एक समस्या थी। मैं उनमें से किसी का भी उपयोग नहीं कर रहा हूं। – dukereg

+1

क्या आपने अन्य समस्याओं को छोड़ने और लीन रन मुद्दों पर ध्यान केंद्रित करने के लिए सीधे जावा-सीपी क्लोजर.जर clojure.main /path/to/myscript.clj के साथ स्क्रिप्ट चलाने की कोशिश की है? – jneira

उत्तर

1

मुझे इसी तरह की समस्याएं थीं और एक जार फ़ाइल बनाने और फिर इसे चलाने का सहारा लिया।

lein uberjar 
java -jar project-standalone.jar 

यह थोड़ा धीमा है, हालांकि यह मुझे अनावृत कर दिया गया है। एक उत्तर जो प्रतिलिपि से काम करता है बेहतर

+0

आप सही हैं; यह धीमा है, लेकिन यह काम करता है। ऐसा लगता है कि लीन रन में इसके साथ कुछ गड़बड़ है। – dukereg

+2

एक ही समस्या वाले लोगों को ध्यान रखना चाहिए कि इस तरह से स्टैंडअलोन जार चलाने से पहले उन्हें अपने नामस्थान घोषणा में ((जेन-क्लास) की आवश्यकता है। – dukereg

0

समस्या के लीन पहलुओं के बारे में निश्चित नहीं है, लेकिन निश्चित रूप से emacs में stdin काम करना असंभव है। हालांकि, अगर आप उपयोगकर्ता से पाठ प्राप्त करना चाहते हैं, तो आप आसानी से इसे इस कोड की तरह एक JOptionPane मेरी छोटी टिक टीएसी को पैर की अंगुली कार्यक्रम से का उपयोग कर सकते हैं:

(defn get-input [] 
    (let [input (JOptionPane/showInputDialog "Enter your next move (row/column)")] 
    (map #(Integer/valueOf %) (.split input "/")))) 
6

कोशिश "ट्रैम्पोलिन रन लें"। भी https://github.com/technomancy/leiningen से अधिक जानकारी के लिए http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b देखें:

प्र: मैं अपनी परियोजना के अंदर stdin के लिए पहुँच नहीं है।

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

1

लपेटें अपने पढ़ने लाइन के साथ पढ़ने के लिए ऑनलाइन समर्थन मैक्रो जो एनएस में है के साथ कॉल swank.core [के बाद से स्वांक-clojure 1.4 + मेरा मानना ​​है कि]:

(use 'swank.core) 
(with-read-line-support 
    (println "a line from Emacs:" (read-line))) 

के लिए धन्यवाद फिक्स के लिए ताविस जुड।

संबंधित मुद्दे