I'm trying to resolve a reflection warning in Clojure that seems to result from the lack of type inference on function return values that are normal Java objects. Trivial example code that demonstrates the issue: (set! *warn-on-reflection* true) (defn foo [#^Integer x] (+ 3 x)) (.equals (foo 2) (foo 2)) => Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved. true What is the b
こんにちは。 徐々に書けることが広がってきてはいますが、まだ4分の1。 とりあえず地道に続けます。 前章で述べたJavaの呼び出しで述べた方法を使ってJavaを呼ぶのがClojureでは普通。 これで基本的には十分に高速のはずだが、さらに高速化を行うことができる。 これは外部IFには影響を与えずに出来るため、後からチューニング・・・ということも可能。 1.性能のためにプリミティブを使う これまではパラメータに型情報をつけていなかった。 #メタデータで型ヒントをつけられるということについては書いてましたが。 これはコードをすっきりさせるが、その分データ型がわかりにくくなり、性能上のオーバヘッドも発生する。 → このやり方をダックタイピングという模様。 例として、1からnまで足し合わせる関数を考える。 (defn sum-to [n] (loop [i 1 sum 0] (if (<= i n
Clojure では Java のメンバメソッド呼び出しも関数呼び出しと同じように書くことができます. たとえば,Java の obj.memberMethod(); は, (.memberMethod obj) のように頭に . を置くことで関数呼び出しと同じように書くことができます.ちょうど,f という関数があったとして,それを使って, (f obj) と同じ形になっていることが分かります. それだからといって,Java のメンバメソッドを関数と同じように扱うことはできません.たとえば, (map f coll) と書くことはできても, (map .memberMethod coll) と書くことはできません.仕方が無いので, (map #(.memberMethod %) coll) と #(...) を使って関数でラップすることになるのですが, この用途のために clojure.c
Clojure の型ヒント (type hinting) とプリミティブヒント (primitive hinting) との違いを整理し,これら 2 つを同時に扱うヒントを紹介します. Clojure では Java メソッド呼び出しの際にパラメータに対して型ヒントをつけることができます.そして,メソッドのレシーバに型ヒントをつけたり,オーバーロードされたメソッドの引数に型ヒントをつけたりすることで,コンパイル時に実装を決定でき実行時のリフクレクションを避けることができます.これは,Clojure で Java と同等の実行速度を得るために必須の作業になります. たとえば,Long/getType は, getType(char ch)getType(int codePoint)の 2 つのシグニチャをもつので,型ヒント無しではコンパイル時に実装を決定できません. user=> (defn
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く