2008-12-23 96 views
13

雖然涉足Clojure,但我寫了一個非常基本的程序來回應用戶輸入的任何內容。然而,它不會以我認爲是自然的方式運行。下面的代碼:Clojure - 副作用發生故障

(defn goo [] 
    (print "echo> ") 
    (def resp (read-line)) 
    (print resp) 
) 

我希望代碼可以這樣運行了(對我來說在foo作爲輸入到read-line打字):

user=> (goo) 
echo> foo 
foonil 

而是回聲和讀線切換:

user=> (goo) 
foo 
echo> foonil 

爲什麼會發生這種情況?我錯過了一個微妙的東西嗎?

編輯:從喬的回答,更新的正確的解決辦法是:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
    (flush) 
) 

此外,沖洗是沒有必要的,如果你使用println而不是print

回答

17

我對clojure一無所知,但這聽起來像是緩衝區未被刷新的情況。找出打印後如何沖洗標準。 println函數可能會在每行結尾處刷新。嘗試:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (def resp (read-line)) 
    (print resp) 
) 
+0

這做到了!打印完成後添加(刷新)。感謝您及時的回覆! – 2008-12-23 03:10:02

13

此外,請不要使用「def」,除非你確實真的想要定義一個全局變量。用 「讓」,而不是:

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (let [resp (read-line)] 
    (print resp) 
    (flush))) 

,或者更短的

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (print (read-line)) 
    (flush))