Clojure for the Brave and True: Chapter 01 読み

かんたんなスニペットをREPLを利用して書いていく章。言語機能をひとめぐりするのにREPLは有用だ。

ところでClojureのプログラムはLeiningenというツールを使ってビルトするのが常識(de facto standard)になっているらしい。よって、ここではまずLeiningenを覚える必要がある。

本章の流れは以下のようになる。

  • LeiningenでClojureのプロジェクトを生成する
  • プロジェクトをビルドしjarを生成する
  • jarを実行する
  • Clojure REPL内でコードを実行する

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(ClojureJavaScriptに変換するトランスパイラ)が存在するらしい。

(上の疑問についてはすぐ下の段落で述べられていた…くそ…)

JVM向けの実装はJVMのコアフィーチャーに依存する(スレッディングやGCなど)。本書はJVM実装のみについて扱っている。

JVMClojureの関係については後ほど述べられるが、今の所必要な認識としては

Leiningen

Leiningenの役割。

  • Clojureプロジェクトの作成
  • Clojureプロジェクトの実行
  • Clojureプロジェクトのビルド
  • REPL

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名前空間に入っていることがわかる。