2013-09-29 42 views
0

说我想让用户输入一行一行的矩阵。 所以我首先要求矩阵的大小, 然后我想要求用户输入行像“第1行”“第2行”等。我怎样才能获得逐行clojure输入?

最微不足道的事情似乎要有一个可变的载体,并使用像doseq这样的somethinkg来改变它。

但我很好奇,如果有更多的clojure方式来做到这一点。 我最初的想法是使用formap。但它很懒,所以无法打印出提示。
所以像(map (fn [i] (do (printf "row %d \n" i) (read-line))) (range size))这样的东西也会在结果列表中包含提示。

然后,我以为我可以使用宏只是产生像

[((println "row i") (read-line)) 
((println "row i") (read-line)) 
((println "row i") (read-line)) ...] 

是否有反正我可以做到这一点没有宏或可变的变量? 哪种方式更好?

回答

0

下做你要求什么,只要我明白你的问题正确:

(loop [i (read-line) 
     ret []] 
    (println "row" i) 
    (if (some-condition) 
    ret 
    (recur (read-line) (conj ret i)))) 

例如,具有条件为(= i "x")

user=> (loop [i (read-line) ret []] (println "row" i) (if (= i "x") ret (recur (read-line) (conj ret i)))) 
SOME 
row SOME 
some 
row some 
XXXX 
row XXXX 
my my my 
row my my my 
1 
row 1 
2 
row 2 
3 
row 3 
4 
row 4 
5 
row 5 
x 
row x 
["SOME" "some" "XXXX" "my my my" "1" "2" "3" "4" "5"] 
user=>