LoginSignup
1
1

More than 5 years have passed since last update.

Clojure + nrepl で System.out.print() とかが出力されない事の対処

Last updated at Posted at 2017-04-06

症状

理由はよく分かんないけど、Clojure から使っている Java のライブラリの中で System.out.print() とかしてる部分があってそれが表示されなかった。

別に Java で書いたからダメって事ではなくて

(.print System/out "aaa")

とかやっても出ない。

対処法(とりあえず理由はおいといて)

(let [print-stream
      (fn print-stream
        [type]
        (let [printer (case type
                        :out '*out*
                        :err '*err*)]
          (java.io.PrintStream. (proxy [java.io.OutputStream] []
                                  (close [] (.flush ^java.io.OutputStream this))
                                  (write
                                    ([bytes]
                                     (.write @(resolve printer) (String. bytes)))
                                    ([bytes ^Integer off ^Integer len]
                                     (let [byte-range (byte-array
                                                       (take len (drop off bytes)))]
                                       (.write @(resolve printer) (String. byte-range)))))
                                  (flush []
                                    (.flush @(resolve printer))))
                                true)))]
  (System/setOut (print-stream :out))
  (System/setOut (print-stream :err)))

とかを、どこの namespace でもいいのでevalする

ほぼ https://github.com/clojure-emacs/cider-nrepl/blob/master/src/cider/nrepl/middleware/out.clj のまるパクりです。

途中まで調べた事

上に

(.print System/out "aaa")

が表示されないと書いたけど、Emacs から cider-jack-in するとダメだけど

java -cp ~/.m2/repository/org/clojure/clojure/1.8.0/clojure-1.8.0.jar clojure.main

と、シンプルな構成で起動すると問題なかったので、nrepl あたりで問題が出てそう。

多分、System.out.print() とかで表示されてないというのは、nrepl の サーバの System.out に出てるんだろうけど、それが nrepl のクライアントに来てないのかと思う。

でも、cider.el の変数 cider-jack-in-nrepl-middlewares で、その辺り設定していると思うんだけど、特にイジってなくて ("cider.nrepl/cider-middleware") で、いいのかなと思う。

直接、問題の箇所っぽい cider.nrepl.middleware.out/wrap-out だけを指定しても変わんないし。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1