Clojureプログラミングの基礎【現役エンジニアがわかりやすく解説】

PROGRAM

Clojureプログラミングの基礎を知りたい方に。

この記事を読まれている方は、

  • Clojureのプログラミングがどんなものか知りたい
  • Clojure言語の簡単な書き方が知りたい
  • Clojureが使われる場面を知りたい

おそらくこのように考えている方が多いと思います。

この記事を書いている私は、
プログラミング未経験から転職を果たした現役のWeb系エンジニアです。
エンジニア歴は3年ですが、本業とは別にフリーランスの副業で月10万円ほど、多いときで20万円ほどの収入があります。

この記事では、現役のエンジニアが、Clojureプログラミングの基礎を解説しています。

プログラミング言語のClojureの特徴

プログラミング言語のClojureの特徴

Clojureはプログラミング言語のひとつで、動的型付けの言語で、非純粋関数型の言語です。
ClojureはJavaVM上で動作する言語で、コンパイルによってJavaVMバイトコードに変換されます。

動的型付けの言語とは、簡単に言うと、データを文字列型や数値型、論理型などに分ける必要がない言語のことです。

コンパイルとは、プログラムの実行前に、開発者の方でコンパイラーを使って構文チェックなどをしたうえで中間言語に変換することを意味しています。

コンパイルをする必要のある言語のことをコンパイル言語、その必要がない言語のことをスクリプト言語と呼びます。
Clojureはコンパイル言語ですが、ユーザーが事前にコンパイルすることもできますが、実行の際に自動変換されるので、スクリプト言語のようなイメージで使うことができます。

関数型言語とは、関数の組み合わせでプログラミングを行う言語のことです。具体的には、変数の再代入などができず、関数を再帰的に呼ぶなどしてループを実現したりします。
ただ、手続き型言語のように書くこともよくありますので、手続き型言語と関数型言語とのハイブリッドとも言えます。

Clojureを使えば、関数型言語で、変数の再代入などがないので、可読性が高いプログラムを書けるようになります。

ただし、その分学習コストが高いです。
手続き型言語やオブジェクト指向型言語に慣れている方たちにとっては、関数型の学習は苦痛に感じることでしょう。
しかし、Haskellとは異なり、while文はありますし、dotimesなどで簡単にループさせることができるので、Haskellと比べれば難易度は低いと思います。

また、ClojureではJavaのクラスを使うことができ、Clojureの中で直接呼び出すこともできるので便利です。

Clojureの用途

Clojureの用途

Clojureは関数型言語のため、アンチパターンを実装しにくく、可読性の高いコーディングを行うことができます。ただし、非純粋で動的型付けの言語なので、Haskellよりは可読性が低くなる気がします。

Clojureを使った開発としては、Web開発が多いようです。Ruby on Railsのようなフレームワークがあるわけではないのですが、特定のフレームワークに依存しないライブラリが多く、これを組み合わせることで自由に開発ができる点が開発者から評価されています。

ただ、関数型言語でマイナーな言語というのもありますので、通常のWeb開発ではRubyやPHP、Python等を使えば十分で、あえてClojureを選ぶ理由はないと思います。

Clojureの書き方

Clojureの書き方

ここでは簡単に書き方を少しだけ紹介します。実際に始める気になったら、ぜひ参考書などの教材を参考にして、試してみて下さい。

Hello World!を画面に出力する

まずはお決まりのHello World!という文字列を画面に出力する方法から。

(print "Hello World!")

これで出力することができます。
ClojureはLISP系言語なので、括弧を多用する書き方をします。

変数宣言と分岐処理

次は少し踏み込んで、変数宣言と分岐処理をしてみます。

(def age 19)
(if (< age 20)
  (print "未成年")
  (print "成人"))

上記の例では、まずageという数値型の変数を作り、その中に19という数値を入れています。
次にageが20未満であれば”未成年”という文字列を、それ以外であれば”成人”という文字列を出力するような分岐処理をしています。

配列と繰返処理

続いて、配列の使い方と繰返処理について、解説します。

ここでは配列を作って、以下のようにデータを出力することにしましょう。

佐藤,田中,小林

これを出力するコードは以下です。

(def students ["佐藤" "田中" "小林"])

(dotimes [i (count students)]
  (print (students i))
  (when (< i (- (count students) 1))
    (print ",")))

上記の例では、dotimesを使って手続き型言語のfor文のようにプログラムを書いています。

まず文字列型の配列studentsに「佐藤」「田中」「小林」の3つの文字列を格納しています。
その後、数値型のカウンタ変数iを0に初期セットし、配列studentsの要素の数に到達するまでループでiを1ずつ増やし、まわしていきます。その際に、print関数を使い、配列studentsのi番目の要素の値を出力し、最後の要素以外、その後に「,(カンマ)」を付けて出力しています。

構造体の取り扱い

最後に構造体の取り扱い方法について解説します。

ここではエクセルのようなデータを作って、以下のようにデータを出力することにしましょう。

名前:佐藤,性別:男性
名前:田中,性別:女性
名前:小林,性別:女性

これを出力するコードは以下です。

(def first_row (hash-map
	"A" "佐藤"
	"B" "男性"
	"candy" 200))
(def second_row (hash-map
	"A" "田中"
	"B" "女性"
	"candy" 200))
(def third_row (hash-map
	"A" "小林"
	"B" "女性"
	"candy" 200))
(def excel_data [first_row second_row third_row])

(dotimes [i (count excel_data)]
  (print (get (excel_data i) "A"))
  (print ",")
  (println (get (excel_data i) "B")))

まずfirst_row, second_row, third_rowという、キー・値がともに文字列型の連想配列を3つ作り、Aというキー(列)に名前を、Bのキーに性別の値を入れていきます。
そして、それら全てをexcel_dataという連想配列型の配列に入れます。
その後、数値型のカウンタ変数iを0に初期セットし、配列excel_dataの要素の数に到達するまでループでiを1ずつ増やし、まわしていきます。その際に、print関数を使い、配列excel_dataのi番目の要素の中のA列とB列の値を出力しています。

まとめ:ClojureはLISP系の非純粋関数型言語

まとめ:ClojureはLISP系の非純粋関数型言語

Clojureの良さを簡単にまとめると、以下のとおりです。

  • 可読性が高い ← 関数型言語
  • Javaのクラスが使える← JavaVM上で動作
  • 自由にライブラリを使える ← 特定の環境に依存しないライブラリが多い

つまりClojureは、関数型言語のため、可読性が高い言語であり、JavaVM上で動くため、Javaのクラスを直接呼び出せたり、Web開発に便利なライブラリなどが揃っていて、大きな開発でも安心して使える言語ということになります。

ClojureはWeb開発で使われることがあるものの、通常は使われず、案件数としてはかなり少ないので、これからWeb開発を目指す方には、PHPやRuby、Pythonを学ぶことをオススメします。これらのオブジェクト指向型言語を一通り習得した方であれば、新たにClojureを学ぶという選択は有益かもしれません。しかし、初心者の方がいきなり関数型言語から入るのは地雷を踏む行為のような気がします。

それでもClojureを学ばれる場合、関数型言語なので、独学は少し難しいかもしれません。もし独学でできなさそうな方は、プログラミングスクールも手段の一つに入れると良いと思います。