Friday, June 8, 2012

Clojure入門「プロジェクトを作る」

こんにちは。ニャンパスの清水です。

前回の続きで、Leiningenを使ってプロジェクトの作り方を解説します。

プロジェクトを作る

プロジェクトを作るには

lein new プロジェクト名

というコマンドを使います。試しにHello worldを作ってみましょう。

lein new hello-world

すると、hello-worldというディレクトリが作成され、その中にプロジェクトのテンプレートとなる以下のファイルが用意されます。

README ... リードミーです。プロジェクトの説明等を書きます。
project.clj ... プロジェクトの構成を定義するファイルです。
src/hello_world/core.clj ... 標準で用意されるソースファイルです。
test/hello_world/test/core.clj ... core.cljのテストの為のソースファイルです。

まずはproject.cljを編集します。このファイルにはプロジェクトのバージョンや依存するライブラリ等を記述します。作成されたばかりのproject.cljは以下のようになっているハズです。

(defproject hello-world "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.3.0"]])

とりあえず以下のように編集します。

(defproject hello-world "1.0.0"
  :description "Hello world."
  :dependencies [[org.clojure/clojure "1.3.0"]]
  :main hello-world.core)

"1.0.0"と書いたところはプロジェクトのバージョンです。ライブラリを作る場合等に重要になりますが、今回は適当に決めます。

descriptionはプロジェクトの説明です。

最後に追加した

:main hello-world.core

というのは、プロジェクトを実行した際にエントリーポイントとなる名前空間を指定しています。"hello-world.core"という名前空間はlein newで作成されたcore.cljの名前空間です。ここで指定した名前空間の中の"-main"という名前の関数が実行されます。(名前は変更することもできます。)

実装する

core.cljを編集してHello worldを実装します。

(ns hello-world.core)

作成されたばかりのcore.cljは上の一行しか書かれていません。これはこのファイル(実際にはnsより下に書いたもの)の名前空間がhello-world.coreだという宣言です。ここにエントリーポイントとなる-main関数を定義します。

(ns hello-world.core)

(defn -main []
  (println "Hello, world!"))

関数を定義するには"defn"というマクロを使います。Clojure(やその他のLisp)のマクロはCのマクロよりも強力で、構文のようなものまで作れてしまいます。

defnは以下のような形式で使用します。

(defn 関数名 [引数] 本体)

関数名には-mainを指定します。Clojureでは変数や関数の名前に"-"や"+"や"?"など色んな文字を使うことができます。前回、数値を足し合わせるのに使った"+"も実は"+"という名前の関数なのです。

引数の部分は空にしておきます。本体には"Hello, world!"を出力する処理を記述します。

(println "Hello, world!")

文字列を出力するには"println"関数を使用します。これはJavaのprintlnメソッドとだいたい一緒で、引数として渡した値を出力します。

以上がHello worldの実装です。

実行する

実行する前に、使用するライブラリ(今回はClojureの標準ライブラリだけ)をプロジェクトに追加します。

lein deps

というコマンドを実行するとproject.cljの内容に応じてライブラリが取得され、プロジェクトのlibディレクトリの中にコピーされます。

これでようやく実行できます。実行するには

lein run

というコマンドを使います。起動に時間がかかりますが、何も問題がなければ

Hello, world!

と出力されます。めでたしめでたし。

問題がある場合には少し不親切なエラーが表示されるので、project.cljとcore.cljを確認してみてください。

次回はClojureの関数とかマクロについて少し詳しく解説できたらいいなと思ってます。

No comments:

Post a Comment