2012-06-04 38 views
7

現在的問題是,當我運行我的程序lein run它到達(read-line)部分,我無法擺脫它,這意味着:read-line永不返回。爲什麼在使用lein運行敲擊ENTER(看起來像一個掛起)之後,read-line不會返回,而是與lein repl一起使用?

下面是相關代碼:

(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)然後它工作正常:S

+0

什麼命令?你會考慮編輯你的原始文章並把它放進去嗎?我試圖建立你的代碼並看看它。我想我知道它是什麼,但很高興看到它。謝謝。 – octopusgrabbus

+0

@octopusgrabbus在那裏,我添加了缺失的行。 – Deleteman

+0

在lein repl,你怎麼稱呼它?我剛剛進入(請求輸入)。無可否認,我將自己的區域設置爲一個項目。我會在我的答案中將項目和src標題作爲編輯發佈。 – octopusgrabbus

回答

12

嘗試雷音蹦牀運行,它的工作原理。

以下是leiningen FAQ:

問:我沒有我的項目中獲得標準輸入。

答:這是JVM的進程處理方法的限制;他們都沒有正確地暴露標準輸入。這意味着像readline這樣的函數在大多數情況下都不會像預期的那樣工作,儘管repl任務必須包含一個解決方法。您也可以在Leiningen退出而不是將其作爲子進程啓動後使用蹦牀任務來啓動您的項目的JVM。

+0

是的!現在你會想解釋爲什麼是這樣嗎? :) – Deleteman

+0

我的猜測是lein蹦牀運行的作品,因爲數據正在被刷新。 – octopusgrabbus

+0

感謝您的編輯!我會再次投票,但我不能:( – Deleteman

0

我試過你的源代碼,但省略了刷新。它工作沒有問題。你使用的是什麼版本的Clojure?我用Clojure 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) 
    )) 

編輯: 我改變了你的職責,我複製與測試之一,它現在獨立和雷音運行工作。您的原始示例中有(沖洗)。

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

從我可以爭取,導致的println沖洗,打印不,你需要打印後沖水。

我在添加這些信息的情況下可能會有所幫助。我有一個名爲repl-test的Clojure項目。這是我的repl-test項目的core.clj文件頭。您已經發布的源文件包含其他一些功能,與您的文章無關。

(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文件:

(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

同樣的道理,請記住,在Repl上它工作正常,如果我執行'lein repl'然後調用'(-main)'程序正常工作,但是如果我用'lein run'運行它,read line永遠不會返回。順便說一句,我的核心是與蹦牀選項正確工作..你碰巧知道爲什麼? – Deleteman

相關問題