Clojure

beanの逆関数unbean

POJO(一般のJavaオブジェクト)をbeanとみなして、プロパティのマップを返してくれる関数 bean がある。http://clojuredocs.org/clojure_core/clojure.core/beanbeanで作ったマップからオブジェクトに戻したい場合もあると思うので、beanの逆関数 unbean を作…

メタデータを含めたPretty Print

ここから抜粋https://groups.google.com/forum/?fromgroups#!topic/clojure/5LRmPXutah8 (use 'clojure.pprint) (defn ppm [obj] (let [orig-dispatch *print-pprint-dispatch*] (with-pprint-dispatch (fn [o] (when (meta o) (print "^") (orig-dispatch (…

Clojureのパーサコンビネータライブラリ fnparse を使う

前記事と似たような話。プログラミングHaskellの第8章で紹介されているパーサコンビネータと同じようなことができるfnparseというライブラリがClojureにも存在する。パーサコンビネータと言えばScalaのライブラリ(コップ本*1 31章)にもあるが、どれも似たよ…

clojure.core.logicでPrologのような論理型プログラミング

clojure.core.logicというClojureをProlog化するライブラリがある。Prologとは、論理型プログラミング言語。 下記のサイトで詳しい説明をしている方がいらっしゃるので、論理型言語についての説明は省略。 http://www.geocities.jp/m_hiroi/prolog/このProlo…

遅延シーケンスとwith系マクロの相性の悪さ

(defroutes main-routes (GET "/somecsv" [] (sql/with-connection db ;; DBから大量のデータを取って文字列の遅延シーケンスを返す (some-table-to-csv-lines ...) ))) こういうのを書くと、遅延シーケンスが最後まで計算される前にDBのコネクションがクロ…

メッセージ国際化関連のライブラリを作った

Webアプリなどを作るとき、国際化しておくとかっこいい。 java.utilにそういうものをサポートするResourceBundleという仕組みがあり、Clojureから簡単に使えるものを作成。 類似のライブラリは他にもあるが、これはClojure内でResourceBundleの定義が出来る…

ClojureのSOAPライブラリ

Clojure用のSOAPライブラリを公開。 https://bitbucket.org/taka2ru/clj-soap 準備 Leiningenのproject.cljにこう書くだけで利用可。 project.clj (defproject someproj "0.0.1-SNAPSHOT" :depenencies [[org.clojure/clojure "1.2.1"] [org.clojure/clojure…

vimclojureとcakeのインストール

vimclojureとcakeで簡単にslime/swank的なことができる。 Ubuntu 11.04での設定を書いておく。まあ、ここにも載ってるわけですが・・・ http://ubuntuforums.org/showthread.php?t=1746137 初期設定 まずは必要なパッケージをインストール $ sudo apt-get in…

チルダクオート

マクロを組むときには変数捕捉に気をつけないといけないが、実は変数捕捉をうまく使う方法もあって、On Lispにそんな例が載っている。 http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/anaphoricMacros.html一番簡単な例としては、アナフォリックIFがあ…

error-kit解説

clojure.contrib.error-kit*1を使うと、Common Lispのconditionに似たエラー処理ができるようになる。 Clojureのエラー処理では、Javaのtry/throw/catchをそのまま使うが、error-kitのwith-handle/raise/handle/bind-continue/continue*2を使う。bind-contin…

error-kitを使ってretry

error-kitとtrampolineを使ったリトライ処理の実装。 (ns jp.t2ru.retry (:use [clojure.contrib.error-kit])) (defn- do-with-retry [f & args] (with-handler {:result (apply f args)} (bind-continue retry [& args] #(apply do-with-retry f args)))) (…

forマクロ

Clojureでプログラムを組んでいるうちに、forマクロが強力だということにやっと気づいたので、リファレンスを書いてみる。 forマクロとは 普通の(というか、CやJava系列の)言語では、forはループ文を表すが、Clojureではforマクロはループではなく、シーケン…

identityの別名定義でmapを便利にする

Clojureのmapでこういう変換をしたくなるときがよくある。(1 "piyo" :foo) -> ({:hoge 1} {:hoge "piyo"} {:hoge :foo})でも、#()で無名関数の定義をしてみると、エラーが出る。 #()の中身は、関数呼び出しorマクロor特殊形式である必要があるため、(#(1))と…

Leiningenで簡単Clojureプロジェクト

Programming Clojureの訳本がもうすぐ出るということで、ここ数日盛り上がり気味のClojure。Amazonに出たので、即注文。Clojureには、Javaで言うMavenに相当するツールで「Leiningen」というのがある。 http://github.com/technomancy/leiningen これを使え…