2011-01-31 23 views

cevap

14

Kontrol dışarı with-in-str:

;; Given you have a function that will read from *in* 
(defn prompt [question] 
    (println question) 
    (read-line)) 

user=> (prompt "How old are you?") 
How old are you? 
34     ; <== This is what you enter 
"34"     ; <== This is returned by the function 

;; You can now simulate entering your age at the prompt by using with-in-str 

user=> (with-in-str "34" (prompt "How old are you?")) 
How old are you? 
"34"     ; <== The function now returns immediately 
+0

Teşekkürler. Sorunun doğru cevabı bu, ama gerçekten ihtiyacım olan şey biraz farklıydı. Aşağıdaki cevaba bakınız. – zippy

+0

Sağladığınız bağlantıda bir tane bulunmadığından da bir örnek ekleyebilirsiniz. –

+0

Clojuredocs'ın bir örneği var: http://clojuredocs.org/clojure_core/clojure.core/with-in-str – sanityinc

3

İşte ben bunu kadar sona erdi için örnek kod var:

http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/with-in-str

ClojureDocs onun kullanımıyla ilgili bir örnek vardır. Fikir, giriş ve çıkış akışını alan basit bir sunucu okuma/yazdırma döngü işlevidir. Sorunum, böyle bir işlev için test akışlarının nasıl oluşturulacağıydı ve bir dize işlevinin yapılacağını düşündüm. Bunun yerine ihtiyacım olan şey buydu:

(ns test 
    (:use [clojure.java.io :only [reader writer]])) 
(def prompt ">") 
(defn test-client [in out] 
    (binding [*in* (reader in) 
      *out* (writer out)] 
      (print prompt) (flush) 

(loop [input (read-line)] 
      (when input 
       (println (str "OUT:" input)) 
       (print prompt) (flush) 
       (if (not= input "exit\n") (recur (read-line))) 
       )))) 
(def client-stream (java.io.PipedWriter.)) 
(def r (java.io.BufferedReader. (java.io.PipedReader. client-stream))) 
(doto (Thread. #(do (test-client r *out*))) .start) 

(.write client-stream "test\n") 
İlgili konular