目次
Clojureの読み方
Clojureは関数の組み合わせでコードを表現します。関数を入れ子にする記述を用い、関数自体を値として扱います。 Clojureのコードは全てリストであり、これはコードがデータであることを意味しています。
これだけでClojure構文の多くの部分に触れていると言えます。 珍しい記法を用いてはいますが、Clojureほど表現力が高いげんはありません。 これはLISPの恩恵なので、他のLISP系の言語についても同様のことが言えます。
他の言語と共通している部分
特徴的な部分に触れる前に他のプログラミング言語と共通する部分を挙げてみよう。
1. 左から右へ、上から下へ
読み方であり、処理される順番でもある。
2. 条件分岐、繰り返し処理
3. 関数、構造体、インターフェースの定義
これも予約語に違いがあるが当然できる。
4. コレクション型
コレクション型にはリスト、ベクタ、セット、マップの4種類がある。 ごく普通の使い方ができるが、コレクション型については別に取り上げたい。 というのもClojureのコレクション型はClojureの力の源泉の1つだと言えるからだ。
5. 不変
多くの関数型プログラミング言語と同様に、値は不変である。
6. 関数リテラル
多くの関数型プログラミング言語と同様に、関数は値として扱える。
Clojureの特徴
ここからはClojureの特徴的な部分にフォーカスしてみよう。
1. S式
Clojureも他のLISP系の言語と同様にS式を採用している。 S式ではコードは全てリストとなる。リストとはリスト型のデータなので、コードはデータということになる。
コードがデータであるということはS式で書かれた文章には、同図像性(どうずぞうせい、英: homoiconicity)があるということである。
同図像性があるということは、関数やマクロを通じてそのコード片を簡単に組み替えたり、加工したりできるということ。これによってドメイン固有言語(DSL)を柔軟に作りやすくなる。ということが言える。
簡単に言えば上記のようになるらしいのだが、私には何ことがサッパリである。 プログラミング言語でわからないことは、とにかくコードを書けば大抵わかる様になるので安心だ。
prefix記法
Clojureは関数をprefix記法で記述する。 関数名を最初に書き、その後ろ(右)に続いて引数を書く形。 これは関数呼び出しの書き方だが、LISP以外の言語とそれほど違わない。
というのも他の言語でも関数呼び出しの場合は、関数名が先にきて、その後引数が続くからだ。違う点は始まりの丸括弧の位置ぐらいである。
また、prefix記法では任意の数の引数を拡張できるのが利点である。
式は必ず値を返すので以下のような+関数のみであっても値を返す。
矢印はREPLを利用した場合をイメージしたもの。 通常のClojureとしての矢印は組み込まれた操作だが、これはまた別の機会に触れたい。