【问题标题】:how can i get input line by line in clojure?如何在clojure中逐行获取输入?
【发布时间】:2013-09-29 19:19:22
【问题描述】:

假设我想让用户逐行输入矩阵。 所以我先问矩阵的大小, 那么我想询问用户输入行,提示“第 1 行”“第 2 行”等。

要做的最简单的事情似乎是拥有一个可变向量并使用诸如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)) ...]

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

    如果我正确理解您的问题,以下内容可以满足您的要求:

    (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=> 
    

    【讨论】:

      【解决方案2】:

      查看this question,了解有关从控制台读取多行的惯用方式的信息。

      【讨论】:

        猜你喜欢
        • 2010-11-10
        • 1970-01-01
        • 2011-06-02
        • 2014-01-07
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 2018-01-08
        • 2018-03-18
        相关资源
        最近更新 更多