说我希望用户输入一行一行的矩阵。 所以我先问一下矩阵的大小, 那么我想问一下用户输入行的提示,如“第1行”,“第2行”等。
最琐碎的事情似乎是拥有一个可变的载体,并使用像doseq这样的东西来改变它。
但我很好奇是否有更多的方法可以做到这一点。
我最初的想法是使用for
或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)) ...]
无论如何我可以在没有宏或变量的情况下做到这一点吗? 哪种方式更好?
答案 0 :(得分:0)
请查看this question,了解有关从控制台读取多行的惯用方法的信息。
答案 1 :(得分: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=>