Clojure (クロージャー) は Rich Hickey 氏によって設計・開発された関数型プログラミング言語で、2007 年に公開されました。Clojure は Lisp 方言の一つで、プログラムを S 式 で記述します。( ) だけではなく、[ ] や { } も使うところが Lisp とは異なります。また、Java プラットフォーム (Java 仮想マシン) 上で動作するので、Java と簡単に連携することができます。イミュータブル (immutable) なデータ構造をサポートしていて、並行処理に強いプログラミング言語です。
M.Hiroi は Clojure でプログラミングするのは初めてです。最初は M.Hiroi が知っている Lisp / Scheme の機能を中心に、簡単なプログラムを作りながら Clojure を勉強していきたいと思っております。なにぶん初心者が作るプログラムなので、間違いや Clojure の作法に反することがあるかと思います。何かお気づきの点がありましたらご指摘お願いいたします。たいしたことはできませんが、よろしければお付き合いくださいませ。
Clojure を実行するには Java の実行環境が必要です。M.Hiroi は OpenJDK 21 を使っています。Java のインストールは拙作のページ お気楽 Java プログラミング入門 - はじめに - Java のインストール をお読みください。
Clojure のインストール方法は以下のページで説明されています。
2025 年 5 月時点で、最新バージョンは 2024 年 9 月にリリースされた 1.12.0 です。Ubunts (WSL2) の場合、次のコマンドでインストールすることができます。
curl -L -O https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh chmod +x linux-install.sh sudo ./linux-install.sh
シェルでコマンド clj または clojure を入力すると、Clojure の REPL (Read-Eval-Print-Loop) が起動します。
$ clj Clojure 1.12.0 user=> (+ 1 2 3) 6 user=> (println "hello, Clojure!") hello, Clojure! nil user=> $
REPL で Clojure のプログラムを入力して簡単に実行することができます。終了する場合は CTRL-D を入力してください。
なお、プログラムをソースファイルに書いて、スクリプト言語のように実行することもできます。
$ cat hello.clj (println "hello, Clojure!") $ clj -M hello.clj hello, Clojure! $
オプション -M を指定して clj を実行します。一般に、Clojure は拡張子に .clj を用いるのが普通のようです。
Clojure のプログラムは Java 仮想マシン上で動作するので、JIT (Just in Time) コンパイラなどの技術によりプログラムを高速に実行することができます。その実行速度ですが、たらいまわし関数を使って調べてみました。
リスト : たらいまわし関数 (tak.clj) (defn tak [x y z] (if (<= x y) z (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y))))
REPL では、(load-file "filename") でソースファイル filename を読み込むことができます。時間計測は関数 time を使うと簡単です。それでは実行結果を示します。(tak 22 11 0) を計算しました。
$ clj Clojure 1.12.0 user=> (load-file "tak.clj") #'user/tak user=> (time (tak 22 11 0)) "Elapsed time: 3010.871979 msecs" 11 user=>
処理系 | 秒 |
---|---|
Python (ver 3.10.12) | 62.23 |
Ruby (ver 3.0.2p107) | 25.59 |
Lua (ver 5.4.4) | 22.41 |
Gauche (ver 0.9.15) | 21.29 |
ocamlc (ver 4.13.1) | 9.46 |
SBCL (ver 2.1.11) | 4.90 |
Clojure (ver 1.12.0) | 3.01 |
Julia (ver 1.10.5) | 1.84 |
SBCL (最適化) | 1.50 |
Java (ver 21.0.5) | 1.22 |
GCC -O2 (ver 11.4.0) | 1.19 |
Scala (ver 3.3.4) | 1.11 |
ocamlopt (ver 4.13.1) | 1.05 |
Clojure は SBCL (Common Lisp) よりも高速ですが、GCC, Java, Scala にはかないませんでした。それでも、バイトコードにコンパイルする処理系に比べると、圧倒的に速いですね。Clojure は優れた処理系だと思います。興味のある方はいろいろ試してみてください。
『お気楽 Clojure プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Clojure プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。