2017-05-05 5 views
1

どのように私がクロージャを使うべきかを理解するのが難しいようです。map。私はin-gridsと呼ばれるオブジェクトのリストを持っています。ここでは、方法getCoordinateSystemを使用しません。リスト内のオブジェクトはJavaクラスであることが重要だと思います。私がクロージャーで直接関数を定義すると、mapが機能します。clojureはマップ経由で機能を適用することができません

これは動作します:

(.getCoordinateSystem (first in-grids))

ではなく、この

(map .getCoordinateSystem in-grids)

し、エラーがある:java.lang.RuntimeException: Unable to resolve symbol: .getCoordinateSystem in this context

私はおそらくここに本当に何かを明らかに不足しているが、何よ正確に?フォーム

(map f sequence) 

の発現を持っている場合は

答えて

5

はその後fは、sequenceのすべての要素に対して呼び出されIFnのインスタンスを参照する必要があります。

.は特別な形式であり、.getCoordinateSystemIFnインスタンスを参照していません。

(.getCoordinateSystem (first in-grids)) 

あなたが直接、例えば関数値を構築することができ

(. (first in-grids) (getCoordinateSystem)) 

に相当します

(map #(.getCoordinateSystem %) in-grids) 
+0

私はこれまでに '#(%)'構造体を使っていましたが、ここでは忘れてしまいました! – kakk11

2

mapに便利な代替がfor機能であることが多いです別の選択肢:この方法でforを使用して

(for [grid in-grids] 
    (.getCoordinateSystem grid)) 

mapと同じ効果を持っていますが、もう少し明示的に「1であります「一度に一度だけ」処理の性質。また、Java関数getCoordinateSystemを直接呼び出しているため、Clojure関数リテラル内に直接ラップする必要はありません。

+0

ありがとうございます、あなたの解決策は知っておくと良いです。 – kakk11

0

Leeの答えの代わりに、memfnマクロがあります。このマクロは、その答えに似たコードに展開されます。

(map (memfn getCoordinateSystem) in-grids) 

(macroexpand '(memfn getCoordinateSystem)) 
;=> (fn* ([target56622] (. target56622 (getCoordinateSystem)))) 
+0

'memfn'は、関数リテラル'#(my-fn ...) 'の前の時代からの古い技術であり、やや古くなったと考えられています。 –

関連する問題