18

Me pregunto: ¿cuál es la mejor manera de escribir un programa Clojure que interactúa con un usuario u otro programa a través de stdin y stdout?Escribir una aplicación de línea de comando, perezosa, funcional e interactiva en Clojure

Claramente, sería posible escribir algún tipo de ciclo imperativo, pero espero encontrar algo más flojo/funcional, un poco inspirado por la función "interactuar" de Haskell.

+2

Esta es una pregunta sorprendentemente difícil. tal vez la comunidad necesita clojure.contrib.interact –

Respuesta

5

Esto era lo mejor que podía llegar a:

(defn interact [f] 
    (lazy-seq 
    (cons (do (let [input (read-line) 
        result (f input)] 
       (println result) 
       {:input input :result result})) 
      (interact f)))) 

Se puede utilizar de esta manera:

(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}) 
Cuestiones relacionadas