0

说我想让用户逐行输入矩阵。所以我首先询问矩阵的大小,然后我想询问用户输入行的提示,如“第 1 行”“第 2 行”等。

最简单的事情似乎是拥有一个可变向量并使用诸如doseq之类的一些thinkg来对其进行变异。

但我很好奇是否还有更多的clojure方法可以做到这一点。我最初的想法是使用 foror map。但它很懒,所以无法打印出提示。
所以类似的东西(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)) ...]

无论如何我可以在没有宏或可变变量的情况下做到这一点吗?哪种方式更好?

4

2 回答 2

0

查看这个问题,了解有关从控制台读取多行的惯用方式的信息。

于 2013-09-29T20:16:09.420 回答
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=> 
于 2013-10-01T12:40:13.673 回答