Eclipse で始める Clojure 準備編 & α

この記事は Clojure をどうしても Eclipse で書きたい Eclipse を愛する人のために書いています。
これを書いている筆者自身は普段 Emacs + Cider-mode or inf-clojure を使っていますし、新しく Clojure を始めたいけど Emacs や Vim などというテキストエディタは使ったことないし使いたくないという方たちに対しては IntelliJ IDEA + Cursive を薦めているため、基本的に Eclipse という環境を使うことは推奨していませんしするつもりもないのですがどうやら Eclipse を使いたい方が一定数以上いるようなのでこの記事を書くことにしました。

## 注意

この記事は以下のバージョンで説明しています。

- Clojure 1.7
- Eclipse 4.5
- Counterclockwise 0.34.0.STABLE001
- Leiningen 2.5.2

また Clojure や Leiningen の基本的なことについてはあまり言及していません。

*2016/09/03: 現在 Counterclockwise はメンテ状態のため、今後新しい機能等追加されることもないのでより便利な方が良い場合は Cursive や CIDER を利用できる環境を使った方がいいでしょう。*

## Eclipse のインストール

何はともあれ Eclipse をインストールしないことには始まらないのでインストールしましょう。

https://eclipse.org/downloads/

今回は Eclipse IDE for Java EE Developers 64bit にすることにしました。どれを選んでも大差ない( not sure )はずなので適当でいいですが、自分の環境にあったものにしておきましょう。
一応、今回使う Counterclockwise は 0.34.0.STABLE001 なので前提として以下のものが必須です。 

- Java Virtual Machine (JVM) 7 running Eclipse
- Eclipse 4.5 (Mars)

http://doc.ccw-ide.org/documentation.html#install-as-plugin

JVM は 7 以上であれば 8 でもいいはずです。

## Counterclockwise のインストール

気を取り直して Counterclockwise をインストールしましょう。 Eclipse を起動したら Help->Eclipse Marketplace から Counterclockwise を検索します。
後は適当にインストールします。

![eclipse-marketplace.png](https://qiita-image-store.s3.amazonaws.com/0/14889/3fe3b387-1976-d0af-9568-2e7f19ae39aa.png)

インストールが終わったら Eclipse を再起動しておきます。

本当は Standalone 版があるので別に Eclipse をインストール必要がなかったのはお詫びしておきます。

http://doc.ccw-ide.org/documentation.html#install-as-standalone-product

## Leiningen のインストール

一応 Counterclockwise が Leiningen まで含んでいるのですが、ちょっとバージョンが古いので新しくしておきます(古くても良いよ！って人はスキップしていいです)。

http://leiningen.org/

Leiningen のインストールは上記のページの通りですが、 homebrew などを使ってもインストール出来るらしいです(非 Mac ユーザーなので確認してませんが)。
日本語で丁寧に Leiningen について解説してあってインストールまで説明してある方が嬉しい人はこちらを参照してください。

http://clojournal.com/entry/54e42e79e4b07686596991c1

最後に `lein upgrade` をして `lein version` で Leiningen 2.5.2 がインストールされているのが確認出来れば OK です。

## Counterclockwise の Leiningen のバージョンを変更する

一つ前の Leiningen のインストールの項で説明した通り、 Counterclockwise の組み込み Leiningen はバージョンが古いので新しくします。
Eclipse の Window->Preferences->Clojure->General にある Leiningen jar の項目が空欄なので先ほどインストールした Leiningen を指定します。

![ccw-leiningen-jar.png](https://qiita-image-store.s3.amazonaws.com/0/14889/999f4701-b126-056b-e704-b5098dd3a2b9.png)

普通ならこういうパスになります。 `/home/<user-name>/.lein/self-installs/leiningen-2.5.2-standalone.jar`

## プロジェクトを新規で作成する

File->New->Other... からウィザードを表示して Clojure Project を選択します。

![ccw-new-clojure.png](https://qiita-image-store.s3.amazonaws.com/0/14889/9d3718e2-9e22-6fcd-c6c1-ff70e09b7002.png)

プロジェクト名を入力して(ここでは `ccw-example` )、 Leiningen template を指定します。今回は `default` のままで作成しますが、例えば Web アプリを作りたくて `luminus` を使いたい場合、ここに `luminus` と入力します。
![ccw-create-project.png](https://qiita-image-store.s3.amazonaws.com/0/14889/801a18e0-07d2-3f84-285c-434bc325eab0.png)

作成出来たら、左カラムの Project Explorer にこういうものが表示出来ていると思います。

![ccw-proj-tree.png](https://qiita-image-store.s3.amazonaws.com/0/14889/c35dc2ac-f625-63e5-0f16-abdae41721ab.png)

`project.clj` を表示してみましょう。

```clj
(defproject ccw-example "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]])
```

こんな感じになってると思うので `[[org.clojure/clojure "1.6.0"]]` を `[[org.clojure/clojure "1.7.0"]]` に変更しておきましょう(使う Leiningen を新しくしてもプロジェクト作成のときの Leiningen のバージョンは組み込みのものになっているみたい(バグか仕様かは分からないけど issue あげるほどじゃないしいいかな?))。

## REPL を起動して Hello, World してみる

`Alt + l` -> `h` と入力して REPL をヘッドレスで起動します。もしくは適当なファイルを開いたまま右クリックして Leiningen->Launch Headless REPL for the project と選択して起動してもいいです。

![ccw-repl.png](https://qiita-image-store.s3.amazonaws.com/0/14889/2fd2830a-e3e9-b694-1c20-3aed9852cad5.png)

(ちらっとエラーメッセージが出てますが、これは `project.clj` 開いて REPL 起動しちゃったのでこうなっているだけなので気にしなくていいです)
`<type clojure code here>` とあるのでそこに `(println "Hello, world")` と入力して Enter を押すと REPL に出力出来たと思います。

## main 関数を定義して `lein run` で実行してみる

この辺になると Eclipse がーというより Leiningen の使い方をどのくらい知ってて、 Clojure についてどのくらいの理解があるかという話になるんですが、まぁやってみましょう。

src ディレクトリの下を辿って行くと `core.clj` というファイルがあるので開きます。最初から `foo` 関数が定義してありますが、次のように書き換えてしまいます。

```clj
(ns ccw-example.core)

(defn -main [& args]
  (println "Hello, world"))
```

それから `project.clj` を編集して `:main` を足します、次のように。

```clj
(defproject ccw-example "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.7.0"]]
  :main ccw-example.core)
```

`Alt + l` -> `l` として入力して(または右クリックして Leiningen->Generic Leiningen Command Line を選択) `<task>` を `run` と書き換えて Enter とすると Console に `Hello, world` と出力されると思います。

これを Executable Jar にしたい場合はもう少し設定が必要ですが、そこを説明すると今回のカバー範囲をオーバーしてしまうので省略します( `clojure leiningen uberjar` とかググれば色々ヒットするのでそっち参照してください)。

## ファイルを変更しながら REPL を使う

百聞は一見に如かず、やってみましょう。

`core.clj` を開いて Clojure->Load file in REPL とします。もし REPL を起動してなかったら起動した後に Load file してください。
そしたら次のコードを先ほど書いていた `-main` 関数の下に書いてみます。

```clj
(defn greeting [name]
  (println "Hello, " name))
```

最後の閉じ括弧のところで Ctrl + Enter (もしくは Eclipse メニューから Clojure->Evalute current section or Top Level S-Expression)と押します(このことを式を評価する、と言うことにしておきましょう)。すると REPL に `#'ccw-example.core/greeting` と出力が出てくると思います。これで `ccw-example.core/greeting` が REPL 中に定義されたことになります。

続いてこの関数をちょこっとテストしてみたいのでファイル中に次のコードを書いてみましょう。

```clj
(greeting "foo")
```

同様に Ctrl + Enter と閉じ括弧の後ろでして式を評価してみます。

![ccw-using-repl.png](https://qiita-image-store.s3.amazonaws.com/0/14889/055cb21d-13fa-f293-4474-082cbb360d60.png)

`Hello, foo` と出力されましたね。もう少し遊んでみましょう。 `greeting` 関数を少し編集して次のようにします。

```clj
(defn greeting [name]
  (println "Hello, " name "!!"))
```

この状態で `(greeting "foo")` を評価しても前と同じように `Hello, foo` としか出力されません。 `greeting` 関数を評価しなおしていないので REPL 上の定義は以前のままなのです。なので、ここで `greeting` 関数をもう一度 Ctrl + Enter として評価し、その後  `(greeting "foo")` を再評価すると `Hello,  foo !!` と出力されるようになりましたね。

Clojure を書く人の中で REPL 駆動開発という言葉が使われることがありますが、 Clojure を書く人たちはこのようにして REPL を上手く使いながらコードを書いていくのですね( Clojure に限らず Lisp 系であればこのような芸当を良くすると思いますが/他の言語は知らない)。

余談にはなりますが、 Web 開発などの実際の開発ではこの REPL の上でサーバー起動をしたり、 DB のマイグレーションを実行したりします。そうやって REPL と上手く付き合っていくことでターミナルに戻ってサーバーを起動/再起動したり、マイグレーションを実行したりするといった煩わしさから開放されるのですね。

## Strict/Paredit mode

途中コードを書いていて気付いたと思いますが、例えば文字列を入力しようとしてダブルクォートを入力すると次のように書いている式が赤くなると思います。

![ccw-broken-form.png](https://qiita-image-store.s3.amazonaws.com/0/14889/10c82853-0682-44ef-5211-961803ccb5b4.png)

これはとても鬱陶しいですし、括弧やダブルクォートのように開いたら必ず閉じるものは開き括弧/ダブルクォートを入力したら対応する括弧を自動的に入力して欲しいですよね。なので Alt + D (or Eclipse メニューから Clojure->Switch Edit mode) として編集のモードを変えます。

すると自動的に括弧が閉じられるようになりました。このモードは色々と癖があって括弧を自動的に閉じてくれるかわり、括弧のバランスを壊すような編集が簡単にできなくなっています。ちょっと難しいですが、慣れると高速に Clojure の式を編集することが出来るようになるのでオススメです。

またこのモードで有効になるショートカットは次のページにまとまっているので参考にしてください。
http://doc.ccw-ide.org/keyboard-shortcuts.html#_default_structural_editing_mode

このモードをデフォルトで有効にするためには Eclipse メニューから Window->Preferences->Clojure->Editor の Start editors in strict/paredit Edit mode にチェックを入れてください。

![ccw-edit-mode.png](https://qiita-image-store.s3.amazonaws.com/0/14889/d44444c2-1936-b6c2-05d4-e4469bd5239e.png)

## 自動補完

REPL を起動していて File load in REPL さえしていれば、いつも通り Ctrl + Space で補完が効くと思います。深く触ってないのでもし動かなかったら教えてください。

## 最後に

Eclipse 悪くないと思いますが、 Counterclockwise を使っているユーザーは少ないのと外から見ていてそんなに開発が活発じゃないという印象です。個人的には IntelliJ IDEA と Cursive の方がマシなのではという印象でした。 Cursive は今のところ IDEA のコミュニティエディションでも動作するのでお金を払いたくない方はそちらを使ってみるといいと思います。

ちなみに 2014 年時点で Clojure 開発者のうち 5% しか Counterclockwise を使っていないことも知っておいたほうがいいかもしれません。
https://cognitect.wufoo.com/reports/state-of-clojure-2014-results/
つまり、 Clojure 開発においてはもっと便利で使いやすいものがあるとデータが示してくれているわけですね(まぁ上位が Emacs と Vim を除くと Cursive と LightTable になるわけですが)。

そんなわけで Eclipse を使った Clojure 開発についてでした。

(タイトルに準備編とありますが続きを書く予定はありません。何か間違っていることを書いている場合は編集リクエストかコメントからどうぞ。)