Clojure

Clojureのベクタのメモリ使用量

(vector-of :int)を使えば普通の配列を使った場合の1.35倍、普通のベクタとIntegerを使った場合は7.32倍くらいになる。まぁ全然OKですね。 (defn current-total-memory-usage [] (System/gc) (- (.. Runtime getRuntime totalMemory) (.. Runtime getRuntime…

Clojureのシンボル比較

シンボル比較は何よりも速いと期待していると裏切られる。Clojureではシンボルにメタデータをつけられるので等値なシンボルが等価でない。ただキーワードならちゃんと等価になる。 user> (time (dotimes [_ 1000000] (= 'a 'a))) "Elapsed time: 53.835 msec…

古き良きLambdaExpression

lambda式を動的に生成したい場合を考える。 EmacsLispでは lambda式の形をしたリストはそのまま関数として使用可能なので (funcall (list 'lambda '(x) '(+ x 3)) 3) ;=> 6 とすれば良い。 しかしCommonLisp(Cltl2)では a list whose car is lambda is not, …

3分で試せるClojure

Clojureのビルドツールであるleiningenを使うと簡単に導入できます。javaの開発環境が必要です。 wget http://github.com/technomancy/leiningen/raw/stable/bin/lein chmod +x lein mv lein /usr/bin/ # PATH内ならどこでもよい lein self-install これでイ…

ClojureのderefをいじくるPart2

2010-03-09 - 壊れた計算機のときはproxyを使ってclojure.lang.IDerefのderefをオーバーライドしていたが、今回はclojure.core/derefをそのままいじくった。derefをmultimethodに置きかえて、正規表現をderefしたらre-seqする関数を返すように変更してみた。…

Clojureからのxml・正規表現

camprojファイルから吹き出しのテキストを抽出するClojureのプログラムを書いた。 CamtasiaHukidashi/hukidashi.clj at master · Mozk0/CamtasiaHukidashi · GitHub clojure.xml, clojure.zip, clojure.contrib.zip-filter, clojure.contrib.zip-filter.xml …

ClojureからMeCabを使う

MeCabのJavaバインディングを利用する。replからいきなり使用してもエラーが出て動かないので、compileしたlib経由で使用する。コンパイルは以下のようにすると出来た。 classpathにMeCab.jar 環境変数LD_LIBRARY_PATHにlibMeCab.so(またはdylib) 下のような…

Clojureのderefをオーバーライド

Clojureはリーダマクロを自分で定義できないが、clojure.lang.IDerefのderefをオーバーライドしてやれば少し近いことができる。これはfuture-callでも使われている。 (def awkwardCounter (let [n (atom 0)] (proxy [clojure.lang.IDeref] [] (deref [] (swa…

ClojureでBasicAuth

java.net.Authenticatorをproxyでextendすれば良い。 user=> (import '(java.net Authenticator PasswordAuthentication)) java.net.PasswordAuthentication user=> (def *basicAuth* (proxy [Authenticator] [] (getPasswordAuthentication [] (PasswordAut…

多項のiterate(Clojure)

Clojureのiterateは2項間漸化式しか扱えないので、多項間漸化式を扱えるように拡張できないかと考えた。 (defn myIterate [f & arg] (map first (iterate (fn [%] `(~@(rest %) ~(apply f %))) arg))) (myIterate + 0 1) ;=> (0 1 1 2 3 5 8 13 21 34 55 89 …

Clojure

JavaVM上で動くLispのClojureが熱い Clojure Java資産の活用 (def a (into-array [2 3 1])) ;;;into-arrayはClojureの列をJavaの配列に変える (seq a) ;=> (2 3 1) ;;;seqは整列可能なObjectをClojureの列に変える (java.util.Arrays/sort a (proxy [java.ut…