Как создать входной поток, который читает из строки вместо файла или URL - PullRequest
10 голосов
/ 31 января 2011

Я хочу связать *in* с потоком, который читает из строки вместо «реального» входного потока.Как мне это сделать?

Ответы [ 2 ]

14 голосов
/ 31 января 2011

Выезд with-in-str:

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

Пример использования ClojureDocs:

;; 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 
3 голосов
/ 01 февраля 2011

Вот пример кода для того, что я в итоге сделал. Идея заключается в простой серверной функции чтения / печати, которая принимает входной и выходной поток. Моя проблема заключалась в том, как генерировать потоки тестирования для такой функции, и я думал, что подойдет строковая функция. Вместо этого это то, что мне было нужно:

(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")
...