用Clojure编写一个懒惰、函数式和交互式命令行应用程序

18

我想知道:编写与用户或其他程序通过stdin和stdout交互的Clojure程序的最佳方式是什么?

显然,可以编写某种命令式循环,但我希望找到更懒惰/函数式一些的东西,有点取自Haskell的“interact”函数的灵感。


2
这是一个令人惊讶的难题。也许社区需要clojure.contrib.interact。 - Arthur Ulfeldt
1个回答

5
这是我能想到的最好翻译:
(defn interact [f]
  (lazy-seq 
    (cons (do (let [input (read-line)
                    result (f input)]
                (println result)
                {:input input :result result}))
          (interact f))))

您可以像这样使用它:
(def session
  (take-while #(not= (:result %) 0)
              (interact count)))

REPL:

user=> (str "Total Length: " (reduce #(+ %1 (:result %2)) 0 session))
foobar
6
stackoverflow
13

0
"Total Length: 19"
user=> session
({:input "foobar", :result 6} {:input "stackoverflow", :result 13})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接