かんたんなスニペットをREPLを利用して書いていく章。言語機能をひとめぐりするのにREPLは有用だ。
ところでClojureのプログラムはLeiningenというツールを使ってビルトするのが常識(de facto standard)になっているらしい。よって、ここではまずLeiningenを覚える必要がある。
本章の流れは以下のようになる。
Clojureとはなにか
そもそも論のようだ。
Clojure was forged in a mythic volcano by Rich Hickey. Using an alloy of Lisp, functional programming, and a lock of his own epic hair, he crafted a language that’s delightful yet powerful.
Clojureは神話の火山でリッチ・ヒッキーが鍛造しました。Lisp合金を用い、関数型プログラミングを組み合わせ、彼の英雄的な髪を一房巻きつけ、快適でありながら力強い言語を作り上げたのです。
英語圏特有のなんかカッコイイ言い回しが続くので以下略。
第2段落。Clojureの言語仕様とClojureの実装であるclojure.jarは別物と述べている。clojure.jarはClojureのコードをコンパイルしてJVM向けにバイトコードを吐き出すんですよ、という。
疑問 それでは、clojure.jar以外にclojureの実装は存在するのだろうか?
調べた結果 ClojureCLRという.Net上のCommon Language Runtimeで動くものがある(C#実装), また、 ClojureScript(ClojureをJavaScriptに変換するトランスパイラ)が存在するらしい。
(上の疑問についてはすぐ下の段落で述べられていた…くそ…)
JVM向けの実装はJVMのコアフィーチャーに依存する(スレッディングやGCなど)。本書はJVM実装のみについて扱っている。
JVMとClojureの関係については後ほど述べられるが、今の所必要な認識としては
- JVMはJavaバイトコードを解釈実行する
- JavaコンパイラはJavaソースコードからバイトコードを生成する
- JARファイルはバイトコードの集まりである
- JavaプログラムはふつうJARファイルとして分散している
clojure.jar
はClojureソースコードを読み込んでバイトコードを生成する- 生成されたバイトコードは
clojure.jar
が走っていたJVMプロセス上で実行される
Leiningen
Leiningenの役割。
Java(JRE)のバージョンが古いと困ったことになるらしいが、自分は問題なしだったのでスルー。
とりあえず使ってみる。
新しいClojureプロジェクトの作成
$ lein --version Leiningen 2.7.1 on Java 1.8.0-ea Java HotSpot(TM) 64-Bit Server VM $ lein new app hello $ cd hello
以下のようなディレクトリ構成になる。
- hello/ |+ doc/ |+ resources/ |- src/ |- hello/ | core.clj |+ test/ | .gitignore | .hgignore | CHANGELOG.md | LICENSE | README.md | project.clj
project.clj
はLeiningen用の設定ファイルで、依存関係、プロジェクトを実行するとき、どのファイルのどの関数を実行するか?(ここではsrc/hello/core.clj
の-main
関数)などを設定している。
Clojureプロジェクトの実行
core.clj
のソースは次のようになっている。
(ns hello.core (:gen-class)) (defn -main "I don't do a whole lot ... yet." [& args] (println "Hello, World!"))
ns
は名前空間を宣言しているが気にしなくていい。-main
はプログラムのエントリポイントである。-main
は何か特別なもので、この本ではAppendix Aで補足説明されている(らしい)。
Clojureプロジェクトのビルド
$ lein uberjar
でビルドし、スタンドアロン化することができる。スタンドアロン化とはleiningenがなくても誰のパソコンマシンでも実行できるjarファイルを作ることである(JREは必要)。jarは次のコマンドで実行できる。
$ java -jar target/uberjar/clojure-noob-0.1.0-SNAPSHOT-standalone.jar
REPL
$ lein repl
で対話的環境が起動する。プロジェクト内で起動するとsrc/hello/core.clj
の名前空間に入っていることがわかる。