Clojure(リンク)はLISPファミリの言語のかなり新しいメンバであり、Javaプラットフォームで動作する。2007年に導入され、すで高い関心を集めている。ひとつの理由はClojureの並行処理へのアプローチであり、ソフトウェアトランザクショナルメモリ(STM)のコンセプトを踏まえている。
Stuart Halloway氏は「Programming Clojure」(リンク) (Pragmatic Programmersで公開されている)の著者であるが、この本は現在ベータ版である。私達はStuart氏とClojureやSTM、ツール、さらにたくさんのことを話した。
InfoQ: Clojureは並行処理の支援にSTMを使用していますが、STMについて簡単に教えて下さい。
STMはもっと大きな話である、ミュータブルな状態のための明確なAPIの一部です。みなさんのコードを純粋な機能的でミュータブルなレイヤに分割することによって、2つの大きなメリットがあります。
*純粋な機能的なコードは、テストや再利用がずっと簡単です。
*明確でミュータブルなAPIを選択することが可能ですが、このAPIはみなさんの並行性や拡張性のニーズにぴったりです。Clojureは様々な状況に対して4つの異なるAPIを提供します:refとSTM、agent、varそしてatomです。さらに、いつでもレベルを落としてJava Concurrency APIを使用することが出来ます。
InfoQ: Clojureに興味を持っているもう一つのグループは既にLISPに親しんでいるプログラマ達ですが、彼らがClojureを試す場合にはどのようなことに気をつける必要がありますか?
私からLisperへのアドバイスは「初めは我慢して下さい」です。Clojureは他のLispとの後方互換性に制約されないLispです。これが実際問題として意味しているのは、多くの違いがあるということです。少しClojureを使うとすぐに、みなさんはおそらくRich氏の設計の決定は十分に熱意を持ったものであることに同意するでしょう。
Clojureのウェブサイトには、他の多くのLISPとの違いを示すドキュメントがある(リンク)。Clojureの作者であるRich Hickey氏は、Java開発者のためにClojureを説明したスライド(リンク)と、逆にLISPerの視点から(リンク)書いたものを提供している。
InfoQ: Java利用者、あるいはもっと一般的には、オブジェクト指向プログラミングに慣れている開発者は、Clojureを使うためにどのような習慣を捨てる必要がありますか?
他のホットな新しいVM言語とは異なり、Clojureはオブジェクト指向では *ない* のです。初めはこのことに臆するかもしれません:「どのようにしてオブジェクトなしでシステムを設計するのでしょうか?」
しかしClojureは、皆さんがオブジェクト指向から望む多くのものを提供 *して* います。
* カプセル化(名前空間、private記述と閉鎖による)
*強力な多相性(マルチメソッド)
* 機能的な再利用は継承より優れています(機能とイミュータブルな状態は継承階層よりもうまく構成されます)。
Clojureと多くのオブジェクト指向言語の違いは、オブジェクト指向言語が固定のメニューを提供するのに対して、Clojureの機能はアラカルトなことです。
InfoQ: LISPから始める場合はどのようなリソースがおすすめですか(もちろん、あなたの本の他に)?
Clojureはたくさんの素晴らしいアイデアを結び付けています。Programming Clojureに加え、
*Lispの知識を得るためにはSeibel氏のPractical Common Lisp(邦訳:実践Common Lisp、オーム社)
*LispマクロにはGraham氏のOn Lisp(邦訳:On Lisp、オーム社)
* 並行処理ではGoetz氏他のJava Concurrency in Practice(邦訳:Java並行処理プログラミング、ソフトバンククリエイティブ)
* 機能的プログラミングにはO'Sullivan氏他のReal World Haskell
* Abelson氏とSussman氏のStructure and Interpretation of Computer Programs(邦訳:計算機プログラムの構造と解釈、ピアソンエデュケーション)
をお勧めします。誰もが読むべきだからです。
注:これらの本の大半はフリーでオンラインでも入手可能である:Practical Common Lisp(リンク)、On Lisp(リンク)、Real World Haskell(リンク)、SICP(リンク)。
InfoQ以前からあるLISPのパターン/プラクティスでClojure開発者が避けるべきものは何ですか?(例えば、いたるところでリストを使う代わりに、可能な限り、マップやベクタのようなClojureのデータ構造を好むようにするとか?)
あなたはほとんど質問の中であげています。Clojureでは、リストはほとんどコードのためのものです。データには、ジョブに適した構造を選び、シーケンスのライブラリを採用してください。Java APIを直接呼び出すことも恐れないで下さい。
InfoQ:Clojureのライブラリはどのようになっていますか?
どんなニーズ(ウェブ開発、DBアクセス、テスト、ビヘイビア駆動開発)のためにも、3つか4つの有望なClojureライブラリがあります。著書は「Clojure in the Wild」という章で終わるのですが、その中ではこれらのいくつかを簡単に紹介し、test-isテスティング・フレームワークとCompojureを使ってもっと拡張した例を示しています。
Clojureのメーリングリストで、Rich Hickey氏が先ごろClojureライブラリのメンテナに、彼らが取り組んでいるライブラリの報告を求めていた(リンク)。たくさんのClojureプロジェクトをGitHubのClojure言語のカテゴリ下(リンク)で見つけることができる。
InfoQ: (Javaプラットフォームだけではなく)マルチプラットフォームのClojureを見てみたいと思いますか?
いいえ。ClojureがJavaと統合されていることは、そのパワーの鍵です。もちろん、私は機能的なLispが.NETプラットフォームと一緒になったものを歓迎します -- しかし、それはClojureであるべきではありません。
InfoQ: あなたはClojureプログラミングにどんなツールを使っていますか?
私はEmacsと、SLIMEをときどき使っています。しかし、私は既にEmacsユーザだったので、この選択はいうまでもなかったことです。viやEclipse、IDEA、NetBeans用のプラグインもあります。
IDE/エディタのClojureサポートの例としては:clojure-dev(リンク)(Eclipse)、clojure-intellij-plugin(リンク)(IntelliJ)、enclojure(リンク) (NetBeans)がある。Gorilla(リンク)(VIM)はSLIME(リンク)(Emacs)と似ている。(Bill Clementson氏はClojure用にEmacsとSLIMEを設定する方法を知っている。(リンク))
これらのツールの多くは同じようなことをする必要があるので、こうしたツールのための共通のバックエンドを共同で行う話がある(リンク)。ひとつの選択肢はSLIMEやGorillaのようなアプローチを使うことであり、つまり、Clojureインスタンスを実行し、ドキュメントのルックアップ(Clojureのシンボルはドキュメンテーション文字列をメタデータ(リンク)として持っている)、コードのルックアップ、名前空間のブラウジング等の問い合わせを行うのである。
InfoQ: あなたは今、商用の重要なプロジェクトでClojureを使用したいと思いますか?
もしあなたがアジャイルチームにいて優れたテストスイートがあれば、私はClojureを製品に使用することをためらわないでしょう。
InfoQでは先ごろClojureで作成されたアプリケーションが製品で使用されている例(参考記事)をレポートした。(InfoQにはさらなるClojureに関するコンテンツがある(参考記事リンク))。
みなさんはClojureを検討したいと思われるだろうか?みなさんが面白いとおもわれるのはClojureのどの面だろうか - LISPから受け継いだもの、STM、あるは他のものだろうか?
原文はこちらです:http://www.infoq.com/news/2009/01/clojure-interview-halloway