18

Tôi tự hỏi: cách tốt nhất để viết chương trình Clojure tương tác với người dùng hoặc chương trình stdin và stdout khác là gì?Viết một ứng dụng dòng lệnh tương tác, lười biếng, chức năng trong Clojure

Rõ ràng nó sẽ có thể viết một số loại vòng lặp bắt buộc, nhưng tôi hy vọng sẽ tìm thấy một cái gì đó lười biếng/chức năng hơn, một chút lấy cảm hứng từ chức năng "tương tác" của Haskell.

+2

Đây là một câu hỏi khó đáng ngạc nhiên. có lẽ cộng đồng cần clojure.contrib.interact –

Trả lời

5

Đây là tốt nhất mà tôi có thể đưa ra:

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

Bạn có thể sử dụng nó như thế này:

(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}) 
Các vấn đề liên quan