Написание ленивого, функционального, интерактивного приложения командной строки в Clojure
Мне интересно: как лучше всего написать программу Clojure, которая взаимодействует с пользователем или другой программой через stdin и stdout?
Ясно, что можно было бы написать какой-то императивный цикл, но я надеюсь найти что-то более ленивое / функциональное, немного вдохновленное функцией "interact" Хаскелла.1 ответ:
Это было лучшее, что я мог придумать:
(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})