紫藤のWiki

最近の更新履歴

Clojure


公式サイト

特徴

  • ClojureはJavaで書かれたLisp方言である。
  • 比較的最近出来たらしい。
  • 構文的にはSchemeに似ている。
  • また、Javaのクラス等を呼び出せるので、Lisp系では珍しく、Widget等を作るのも比較的簡単そうである。
  • Javaの知識がある人向け。と言うか、Javaのクラスライブラリに精通していた方が難なく使いこなせそうではある。
  • JVM(Java Virtual Machine)で動く為、マルチプラットフォームである。従って、各種OSへのインストール等も格別問題は見られない。
  • 反面、起動はコマンドラインがメンド臭く、PC-UNIXだと起動用シェルスクリプトが難なく作れるが、Windowsの場合は少々問題が生じるだろう。
  • 公式サイトには次のような特徴が書かれている。
    • 大文字と小文字を区別する。
    • 名前空間はシングルスペース(関数用が用意されていない)のLisp-1である。
    • 空リスト()とnilは同一ではない。
    • readが副作用を生じない。
    • キーワードはシンボルではない。
    • シンボルが保存領域を表さない。
    • nilはシンボルではない。
    • tはシンタックスではなく、代わりにtrueを使う。
    • readテーブルは現時点ではユーザーサイドからはアクセスできない。
    • letは逐次束縛(注:Common Lisp/Schemeで言うlet*のようなもの?)である。
    • doは反復を表さない。
    • 末尾最適化はしない。recurを使え。
    • シンタックス・クオート(`)はSymbol Resolution(注:Java特有の用語か?)を行う。従って`xと'xは同じではない。
    • `は自動でgensym(注:安全にマクロを展開する為、マクロ内部の変数を"固有"で外部の変数と重複しないようにする関数)を行う。
    • ~(チルダ)はクオート解除を表し、,(コンマ)はスペースを表す。(注:Common Lispではコンマがクオート解除を表し、マクロ内部での部分評価を指定できる)
    • mapsとvector用にreaderシンタックスが存在する。(注:ここで言うreaderシンタックスは普通の言語でのシンタックスに相当するらしい。Lispでは一般に、readは単なる入力関数だけではなく、完全なLispパーザを備えているので、入力内容がS式かどうか判別可能である。したがって、readそのものも”完全な”Lispなのである。よってシンタックスがreadレベルでも存在する。故に、readシンタックスは確かにシンタックスである。)
    • consfirstrestは抽象化したシーケンスを扱っていて、cons細胞を弄っているわけではない(注:Pythonに近い?)。
    • 殆どのデータ構造はイミュータブルである。
    • ラムダ式はfnで記述され、アリティによる多重定義もサポートされる、
    • =は等価述語である(注:Common Lispでのequalか?)。
    • 全ての変数は局所的な変数束縛に左右されずに動的に再束縛される。動的変数と局所変数を区別する為のスペシャル宣言は必要としない。ClojureはLisp-1の為、関数は動的に再束縛される。
    • (Schemeの)letrecや(Common Lispの)labelsやfletは存在しない。(fn name [args]...)を使う。
    • Clojureではnilは「何も無い」事を表す。あらゆる型での値の欠損を表すが、特定のシーケンスやリストを指すわけではない。
    • nilは「空状態」を表さない。従って、nilと'()は同じではない。
    • falseはブール値の片方を指し、もう一方はtrueである。
    • list以外にもコレクション(注:Java用語?一種のデータ型のクラス?)が存在し、[], {}, や ()等のリテラル表記を持つ空コレクションからインスタンスを作ることが出来る。従って、空コレクションを代表する表現は存在しない。
    • nilSchemeの#fに近いかもしれない。
    • Clojureの最大の違いは、シーケンス、である。シーケンスはデータ型ではなく、特にリストを意味しない。空シーケンス、等も存在しない。(要素込みの)シーケンスはあるが、(Common Lispでの)(nil)等は無い。空コレクションにシーケンスの要素を訊くと処理系は「何も作ってません」の意でnilを返す。また、restで空コレクションにシーケンスの最後の要素を訊くと「もう無いよ」の意でnilを返す。
    • SchemeCommon Lisp等の、シーケンス関数にあたる関数では、pairs/conses ('lists')を操作して「空」リストに対しては'() や nil等を代表値として返す。Clojureの返り値では空コレクションや、ましてやシーケンスの類を返さないところが違う。いくつかのシーケンス関数はSchemeCommon LispのものよりもHaskellやMLのものに近い。ある種の(Clojureの)関数では、具体的なデータ構造のScheme/CLのリストが意味の無いものを返すところで、「無限大」や計算済みのシーケンスを返す。
    • コレクションとデータ構造、シーケンスと反復子の違いを認識する事が手助けになる。Comon LispSchemeではそれらは同じであるが、Clojureでは別個のものだ。
  • 上の訳は誤訳してる可能性もあるので、あんまり信用しない事。
  • ビデオ講義も用意されている。

備考

  • Clojureはインストール、と言う程ではなくzipフォルダを取ってきて解凍するだけで使える。
  • 解凍したフォルダは(Linuxだったら)HOME辺りに置いておけば良いだろう。
  • Clojureの起動はJavaを利用して端末で
    java -cp clojure.jar clojure.lang.Repl
    と打つ。
  • ただし、これは毎回打つのは面倒臭いので、シェルスクリプトでも作っておけば良いだろう。
  • 例えば、お決まりで
    #!/usr/bin/env bash

    java -cp clojure/clojure.jar clojure.lang.Repl
    等とテキストファイルに書いて、HOME上にcljとして保存しておく。
  • そうすれば端末で./cljと打てばClojureが起動する。
  • Clojureの為の開発環境としては、Emacs用にClojure mode for Emacsenhanced Clojure mode for Emacsが、Vim用にsyntax file for VIMが、netbeans用にenclojureが、それぞれ有志の手によって提供されている。
  • これらを見ても分かるように、Clojureは出来たばっかりのわりには有志の協力体制が既に出来上がっている。これはClojureの開発の活発度と将来性を暗示していると考えられる。

スクリーンショット

Clojure起動画面。
公式サイトに書いてあるコード例を用いてHello Worldポップアップを作ってみたところ。
そのコード例は
(. javax.swing.JOptionPane (showMessageDialog nil "Hello World"))
と言うシンプルなもので、Lisp型書式でJavaのクラスライブラリを呼び出してウィジェットを作り出しているようである。
悔しいが、これは素のCommon Lisp/Scheme辺りで同じ事をやろうとしたら鬼のように面倒臭そうな実例である。
このように、Javaのクラスライブラリに精通していれば、Clojureには簡単に移って来れそうな魅力がある。

動画

Clojure Box

  • 公式サイト
  • 平たく言うと、LispboxのClojure版である。
  • ただし、Lispboxと違って、ベースは開発版のEmacs23で、安定性に少々信頼がおけない。
  • また、バイナリは現時点、Windows版しか提供されていない。
  • ただし、Lispboxに慣れた層だと割りに使い勝手は良さそうである。
  • 今後の発展が楽しみである。