clojure備忘録[最小構成の環境構築]

clojureには簡単に環境構築を行える「leiningen」というツールがあります。
このツールは環境構築だけでなく開発時にも非常に便利に使えるのですが、
インターネットアクセスが可能であることが大前提の為、
proxy越しの環境では動作させるまでに挫折しそうになります。


この手の通信トラブルでやる気をなくしてしまうことを回避するため、本連載ではleiningenは使用しません。
手作業で必要最低限のclojure環境を構築します。
それでは本題に入ります。


必要なものたち

clojureの実行環境を構築するには、次のものが必要になります。

  • java6の実行環境
  • 拠点となるディレクト
  • clojure関連のjar。
  • repl起動用のShellScriptまたはバッチファイル

それでは順に見ていきましょう。

java6の実行環境

clojureJVM上で動くLispです。
当然の事ながら、javaの実行環境が無ければ動かすことはできません。
が、javaのインストールについてはおびただしい数の紹介サイトがありますのでここでは割愛します。
注意するのは一点だけで、バージョンが「6」以上の実行環境をインストールするようにしてください。


拠点となるディレクト

clominalという名称のディレクトリを作成します。
Linuxの場合は自分のホームディレクトリ配下にでも。
Windowsの場合はCドライブの直下にでも作成してください。
後々のトラブルを避ける為にもパス中に半角スペースが含まれるディレクトリ配下には作成しない方がよいかと思います。


今後、このディレクトリを「CLOMINAL_HOME」と記述します。


CLOMINAL_HOME配下に、次のような構成のディレクトリを作成してください。



CLOMINAL_HOME
├lib
└src


以降、CLOMINAL_HOME配下(サブディレクトリ含む)に必要なファイルを格納していきます。

clojure関連のjar

当然ですが、clojureのライブラリが必要です。
必要なライブラリは次の2つです。

ライブラリ名備考
clojure-X.X.X.jar言語のコアとなる機能を提供する。
clojure-contrib-X.X.X.jar様々な便利な機能を提供する。

clojureのダウンロードができるサイト(http://clojure.org/downloads)へ行き、最新の安定版をダウンロードします。
2012/09/09現在、最新の安定版はclojureが1.4.0、clojure-contribが1.2.0のようです。
(ページ見ればどこをクリックするとダウンロードできるか、なんとなくわかると思います。)
これを任意のディレクトリで解凍すると、「clojure-1.4.0」というディレクトリが生成されます。
このディレクトリ中にあるclojure-1.4.0.jarをCLOMINAL_HOME/libにコピーします。
同様に、clojure-contrib-1.2.0.zipを解凍して生成された「clojure-contrib-1.2.0/target/clojure-contrib-1.2.0.jar」を、CLOMINAL_HOME/libにコピーします。


この段階で、現在CLOMINAL_HOMEディレクトリ配下は次のような状態になっていると思います。



CLOMINAL_HOME
├lib
│├clojure-1.4.0.jar
│└clojure-contrib-1.2.0.jar
└src


replを起動するためのShellScript、あるいはバッチファイルの作成

Lispにはよく「repl」と呼ばれるインタラクティブな評価環境が提供されます。
これは、「Read Eval Print Loop」の頭文字をとって作られた単語です。
その評価環境はLispプログラムを入力すると、読んで、評価して、結果を表示し、また入力待ちに戻る、という対話的な特徴を持っています。
unixのshellとかwindowsdos窓みたいなもんです。あれにコマンドを入力するかわりに、Lispプログラムを入力するという違いだと思っていただければよいです。)
clojureもこの伝統に習ってreplの機能が提供されています。
clojureのcoreライブラリ中に定義されている、clojure.mainメソッドを引数なしで呼び出すことでこのreplが起動します。
(他にも便利なやり方がありますが、今はこの前提で話を進めます。)


ではそのやり方を記述したShellScript(Linux用)、及びバッチファイル(windows用)を作成しましょう。
CLOMINAL_HOME直下に、repl.shまたはrepl.batと言う名称の空のファイルを作成してください。


CLOMINAL_HOME
├lib
│├clojure-1.4.0.jar
│└clojure-contrib-1.2.0.jar
├src
└repl.sh(またはrepl.bat)

このrepl.*の中身は次のようになります。

repl.sh

#!/bin/sh

BASE_PATH=${0%/*}
LIB_PATH=${BASE_PATH}/lib
SRC_PATH=${BASE_PATH}/src

java \
-cp \
${SRC_PATH}:\
${LIB_PATH}/clojure-1.4.0.jar:\
${LIB_PATH}/clojure-contrib-1.2.0.jar \
clojure.main


行毎に注釈を入れるとすればこんな感じです。
(自分の備忘録の為に。)


1行目単独実行の為。
3行目このShellScriptの存在するディレクトリパスを取得。
(${0%}でこのShellScriptの存在するフルパスを取得でき、「/*」を付与することで、ディレクトリ名の取得が可能。要は任意の場所からこのrepl.shを実行されても、あくまでもrepl.shが存在する場所を拠点として、配下のlibディレクトリやsrcディレクトリを参照できるようにするために取得している。)
4行目参照するjarライブラリの格納場所のパス
5行目参照するcljファイルの格納場所のパス。cljファイルが内部でnamespaceを定義していた場合、ここがトップレベルのnamespaceとなる。
7行目〜12行目この行から最終行までは、普通1行のコマンドラインとして記述する。
本ShellScriptでは読みやすさを優先するため「\」を使って改行して記述している。
8行目クラスパスを指定するjavaコマンドのオプション。
9行目srcフォルダ配下のcljファイルをクラスパスに追加する。
10〜11行目使用するjarファイルをクラスパスに追加する。
12行目引数なしで、clojureを実行する。


作成したあとは実際に単独実行ができるように実行権限を付与して下さい。
これでShellScriptの内容は完了です。

repl.bat

次はwindows用のバッチファイルです。記述する内容はこのような感じになります。

@echo off

set BASE_PATH=%~dp0
set LIB_PATH=%BASE_PATH%\lib
set SRC_PATH=%BASE_PATH%\src

java ^
-cp ^
%SRC_PATH%;^
%LIB_PATH%\clojure-1.4.0.jar;^
%LIB_PATH%\clojure-contrib-1.2.0.jar ^
clojure.main

pause


文法は違えどやっていることはShellScriptと同じです。(先頭行が「余計な画面出力を抑制する」ことを目的として記述されている事以外は。)
注意点を上げるとするならば2点あります。


1点目は、9行目と10行目の、クラスパス連結文字です。
ShellScriptは「:」(コロン)ですが、バッチファイルだと「;」(セミコロン)になっています。結構ハマりました。


2点目はコマンドの連結文字です。ShellScriptは「\」でしたが、バッチだと「^」なんですねぇ。


windowsのバッチファイルはそれ単独で実行できるので、特に実行権限を付与したりする必要は無いと思います。
replの起動用バッチの準備については以上です。


replの起動

さ、準備は整いました。早速端末(あるいはDOS窓)からrepl.*を実行してみます。
私の環境はLinuxなので、端末から実行します。



~ $ cd clominal/
~/clominal $ ls
lib repl.bat repl.sh src
~/clominal $ ./repl.sh
Clojure 1.4.0
user=>


このように表示されれば無事replが起動しています。


少し横道にそれます。
通常、手続き型の言語ではプログラムを「実行する」と言いますが、Lisp関数型言語では「評価する」と言います。
なので、この連載でもいわゆるclojureのコードを実行する時は、「評価する」と記述しますのでご了承ください。


それではさっそくclojureプログラムを評価してみましょう。
任意のプログラム言語入門時の由緒正しい伝統に敬意を表し、次のコードを評価します。

(println "Hello, clojure world.")


"clojure"が入っているのはご愛嬌。伝統は守るだけではいけません。
では、このコードをプロンプトに入力してEnterキーを押下してみてください。
次のように表示されれば期待通りです。



user=> (println "Hello, clojure world.")
Hello, clojure world.
nil
user=>


如何でしょうか。ちゃんと表示されましたか?
これで最小構成での環境構築については終了です。
どちらかというとjavaコマンドラインについて調査する必要があった、という感じでした。


今後、このreplを使って様々なコードを対話的に試す事になっていきます。
IDEを使用し、「コードを書く→コンパイルする→デバッグ実行する→コードをk(略」というスタイルでプログラムを書いてきた人にとっては、今まで慣れ親しんだ開発スタイルに対し、大きな変化を要求されることになりますので最初は戸惑うかもしれません。
が、このreplはIDEなんか無くても快適な開発環境を提供してくれます。
損はさせませんので、clojureで何かやるときには常にこのreplを立ち上げた状態にしておきましょう。
何が便利なのか、徐々に明らかにしていきます。