3

clojure 1.5.1 を使用して lighttable でrxjava ( http://netflix.github.io/RxJava/javadoc/ ) を使用する場合は、次のことを考慮してください (モナドからデータを抽出するために、副作用のある変更 (恐ろしい!) 外部コレクターを使用する)

(ns expt1.core (:import [rx]))

(def ^:private collector (atom []))
(defn- collect [item]
  (reset! collector (conj @collector item)))

(def string-explode (partial map identity))

(reset! collector [])
(->
 (Observable/toObservable ["one" "two" "three"])
 (.mapMany #(Observable/toObservable (string-explode %)))
 (.subscribe collect)
 )

@collector

これは以下を生成します:

[\o \n \e \t \w \o \t \h \r \e \e]

言いたい

(reset! collector [])
(->
 (Observable/toObservable ["one" "two" "three"])
 (.mapMany (comp Observable/toObservable string-explode))
 (.subscribe collect)
 )

しかし、驚き

clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to find static field: toObservable in class rx.Observable, compiling:(NO_SOURCE_PATH:93:1)
             Compiler.java:6380 clojure.lang.Compiler.analyze
             Compiler.java:6322 clojure.lang.Compiler.analyze
             Compiler.java:3624 clojure.lang.Compiler$InvokeExpr.parse
             Compiler.java:6562 clojure.lang.Compiler.analyzeSeq
             ...

実際、ちょうど

Observable/toObservable

同様の例外を生成します。Observable/toObservable次のような式の場合、Clojure が検出できるのはなぜですか。

#(Observable/toObservable (string-explode %))

のような表現ではありません。

(comp Observable/toObservable string-explode)

?

4

1 に答える 1