Kikuchy's Second Memory

技術のこととか、技術以外のこととか、思ったことを書き留めています。

Clojureのライブラリをまとめてみる

最近、 Clojure なる Lisp 方言の言語に挑戦中です。
詳しい文法だとかは他のページの説明を見ていただくとして。
この ClojureJVM 上で動くので、 Java の資産をそっくりそのまま活用できるという面白い言語になっています。
Java 資産を使える、ということは、 Swing で GUI アプリを作ったり、 Google App Engine で Web アプリを作ってデプロイしたりできる訳ですね。残念ながら、 Android で完動させるまでには至っていないようです。
そのうちに色々作ってみたい。

この言語、 Leiningen というプロジェクト管理ツールを使って色々なライブラリを取り込めるようになっています。
ライブラリは結構な数があるようなのですが、纏まった紹介を見かけないので、少しまとめてみたいと思います。

Seesaw

Swing を扱うライブラリです。ClojureJavaAPI を叩くのはそこそこ面倒くさい上にあまりエレガントではないので、こういったラッパーと、それ用の DSL があると嬉しいですね。
例えば Seesaw 無しでウィンドウを表示してみると

(ns seesawtest.core)

(defn -main []
  (let [f (javax.swing.JFrame. "Window")]
    (doto f
      (.setVisible true))))

まあ単純なコードですが、なんか Clojure っぽくない。
Seesaw を使うとこうなります。

(ns seesawtest.core
  (:use seesaw.core))

(defn -main []
  (native!)
  (let [f (frame :title "Window")]
    (-> f pack! show!)))

おお、 Clojure っぽい! エレガントな感じがしませんか?

Clojure HTTP Client

単純に HTTP で GET したり PUT したりするための API です。
「単純に」と言っても、 Clojure でこれをやろうとすると、また Java のお世話にならなければいけません。 というわけで、 java.net 辺りをラップしてくれているみたいです。
まだ使っていないのですが、Readme を見る限り、

(let [response (request "http://google.com")]
  (:body-seq response))

これで、応答の body にアクセスできるようです。お手軽。
Cookie の管理とかはどうなるのかな。

appengine-magic

Google App Engine 用のラッパーです。
これを使えば、 GAE もClojureで簡単に書けてしまう…らしいです。まだ使ってないので何とも言えないのですが。

Enlive

こちらは HTML のテンプレートライブラリ。 Web アプリを作ろうと思ったら入り用ですよね。
これもまだ使った事無いです。
ベースになる HTML を読み込んで、 CSS によく似たセレクタで要素を選んで改変し、整形済みの HTML を吐き出す、という使い方になるのでしょうか。

Ring

Ruby の Rack にあたる役割をするライブラリだそうです。Web サーバーと Web アプリフレームワークの間を取り持つ API みたいなやつですね。
これ単体で使う事はあまりないような気がします。

Compojure

先ほどの Ring と組み合わせて使う、ルーティングライブラリです。
ルーティングというのは、アクセスされたパスに対して、対応するメソッドを呼ぶ、ということ。
例えば、 /users/ にアクセスされたら、ユーザーの一覧を出すような list-user メソッドを呼ぶ、とか。
こういった対応付けを行うためのライブラリです。
大きなフレームワークに頼らずに Web アプリを作るなら、これが使いやすい気もします。

shake

(2013年5月19日 追記)
shell のコマンドを、関数を呼ぶようにして使うためのライブラリです。
こんな風にして使います。

(require '[shake.static :as sh])
;; この use は input-stream を使うためのもの
(use '[clojure.java.io :only (input-stream)])

;; sh/uname で java.lang.UNIXProcess が帰ってくる
(def uname-proc (sh/uname -a))
;; uname -a の出力表示
(print (slurp (input-stream uname-proc)))

アプリから外部のコマンドを叩くのに丁度良さそうですね!


こんな感じで、何か見つけたら更新したいと思います。
良き Clojure ライフを!






って記事を書いていたらこんなサイトを発見。
The Clojure Toolbox




ま、まあ、この記事は日本語版ってことで!