Написание ленивого, функционального, интерактивного приложения командной строки в Clojure

Мне интересно: как лучше всего написать программу Clojure, которая взаимодействует с пользователем или другой программой через стандартный ввод и стандартный вывод?

Ясно, что можно было бы написать какой-то императивный цикл, но я надеюсь найти что-то более ленивое/функциональное, немного вдохновленное функцией Haskell «interact».


person mikera    schedule 30.03.2011    source источник
comment
Это удивительно сложный вопрос. возможно, сообществу нужен clojure.contrib.interact   -  person Arthur Ulfeldt    schedule 31.03.2011


Ответы (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)))

РЕПЛ:

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})
person dbyrne    schedule 05.04.2011