18

Mi chiedo: qual è il modo migliore di scrivere un programma Clojure che interagisca con un utente o un altro programma con approfondimento su stdin e stdout?Scrivere un'applicazione di riga di comando lazy, funzionale e interattiva in Clojure

Chiaramente sarebbe possibile scrivere una sorta di ciclo imperativo, ma spero di trovare qualcosa di più pigro/funzionale, un po 'ispirato dalla funzione "interagisci" di Haskell.

+2

Questa è una domanda sorprendentemente difficile. forse la comunità ha bisogno di clojure.contrib.interact –

risposta

5

Questo è stato il meglio che potevo venire con:

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

Si può usare in questo modo:

(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}) 
Problemi correlati