Clojure Language Update 2017

これは [Clojure アドベントカレンダー 2017](https://qiita.com/advent-calendar/2017/clojure) 1日目の記事です。今年1年のClojure/ClojureScript界隈の動きを振り返ってみましょう。

# Clojure 1.9リリース間近
昨年5月に1.9 alpha1がリリースされて以降、alphaリリース20回、betaリリース4回を経てようやく先日RCのリリースにこぎ着けました。すでにRC2までリリースが進んでいますが、RC1, RC2ともに本質的にはbeta4と同じもので、正式リリースまでの修正としてはほぼ収束している状態です。

本当はここで「ようやく1.9がリリースされました！」と報告できればよかったのですが、残念ながら正式リリースにはまだ至っていません。しかし、RCリリース後も特に大きな問題が出ていないので、1.9のリリースはもうまもなくではないかと思います。

# clojure.specの分離
さて、Clojure 1.9の開発過程で、1.9の目玉機能とされていた clojure.spec がClojureのコアから切り離され、spec.alpha と core.specs.alpha という独立したライブラリとして開発していくことが決定されました。

spec.alpha および core.specs.alpha は、それぞれ以下のような役割を担っています：

<dl>
 <dt>spec.alpha</dt>
 <dd>clojure.specのコア機能の提供</dd>
 <dt>core.specs.alpha</dt>
 <dd>Clojureコアの関数やマクロに対するスペック定義をまとめたライブラリ</dd>
</dl>

Clojure 1.9としてはclojure.specの機能はひとまずアルファな扱いのままリリースされ、clojure.specの機能はClojure本体とは独立して開発されることになった、ということです。これは比較的リリースサイクルがゆっくりとしているClojureとは独立して、clojure.specの機能開発を活発に進めていくための施策になっています。

ユーザとして clojure.spec の機能を使う分にはこれまでとそれほど大きな違いはありません。ただし、clojure.specに関する従来の名前空間名にサフィックスとして `.alpha` がつくようになりました。たとえば、

- clojure.spec → clojure.spec.alpha
- clojure.spec.test → clojure.spec.test.alpha

といった感じです。

- [[ANN] Clojure 1.9 / clojure.spec split](https://groups.google.com/forum/#!topic/clojure/10dbF7w2IQo)

# 後方互換性について
また、clojure.specの背景にある思想として、後方互換性を保つことの重要性が繰り返し主張されるようになりました。
  
昨年のClojure/conjでのRich Hickeyの基調講演 “Spec-ulation” で、この方針が大きく打ち出され、今年のEuroClojureでのAlex Millerの講演 “Dependency Heaven” でもその内容が補強されています。

- [Spec-ulation](https://www.youtube.com/watch?v=oyLBGkS5ICk)
- [Dependency Heaven](https://www.youtube.com/watch?v=sStlTye-Kjk)

Rich Hickeyは “Spec-ulation” の中で変更には2種類あるといっています。その2種類の変更とは次の2つです：

<dl>
 <dt>Growth</dt>
 <dd>- 機能追加
     - 制約緩和
     - 不具合修正</dd>
 <dt>Breakage</dt>
 <dd>- 機能削除
     - 制約追加
     - 仕様変更</dd>

このうちBreakageはやってはいけないとRich Hickeyは主張しています(これに付随して、「セマンティックバージョニングは壊れている(メジャーバージョンを上げればBreakageが許されてしまう」ということも言っています)。

もともとClojure自体は後方互換性にかなりシビアに開発が進めてられてきました。しかし、これからはこの方針がコミュニティに対しても強く勧められるようになるということです。
かつてRich HickeyがSimpleとEasyの違いについて説き、シンプルさに重きを置くことを伝えたことで、Clojureコミュニティ全体がシンプルさを尊重するようになりました。彼はそれを、今度は対象をGrowthとBreakageに変えてやってみせようとしているように思えます。

後方互換性を保つための具体的な方法として、clojure.specが使えるということも述べられています。

- 関数やマクロのスペックを定義し、すでに定義済みのスペックに反しない範囲の変更しか許さない
- その範囲を超える変更をする場合には、名前を変更して新しい関数、名前空間あるいはライブラリとして提供するようにする(これによってBreakageをGrowthに変える)

この主張がコミュニティにどれだけ受け入れられるかは今後の動向を追ってみないと分かりませんが、とても影響力の大きい強いメッセージになりうると個人的には思っています。

# cljコマンド
clojure.specがClojure本体から分離されたことで、Clojureそのものが別のライブラリに依存する構成になりました。

普段開発にLeiningenやBoot等のビルドツールを使っているとあまり意識することはありませんが、Clojure公式としてはこれまで「JARをひとつ持ってこれば使える」ということを建前としてきました。しかし、clojure.specの分離により、これからはspec.alphaとcore.specs.alphaのJARもあらかじめとってきておくことが必要になってきました。この状況を解決するために登場したのが `clj` コマンドです。

`clj`コマンドは `deps.edn` という形式で依存ライブラリを記述しておくと、依存関係をすべて解決された状態でClojureが起動します。パッケージングの機能は(今のところ)ないため、LeiningenやBootのようなツールを完全に置き換えることはできませんが、サクッとREPLを立ち上げてコードの挙動を確認したり、スクリプティングの用途等には十分使えるでしょう。

`clj`コマンドはすでに Homebrew では配布されているので、MacユーザでHomebrewを使っている人は

```
$ brew install clojure
```

を実行するだけでインストールすることができます。その他のパッケージマネージャについては(詳細は把握していませんが)、随時対応されていくものと思います。

- [Deps and CLI Guide](https://clojure.org/guides/deps_and_cli)

# ClojureScriptの機能改善
今年も1.9のリリースがなかったClojureに比べ、ClojureScriptは今年も活発に開発が進められました。

今年特に改善がなされたのはJavaScriptとの相互運用性の向上でしょうか。以下のような変更がありました：

<dl>
 <dt>JSモジュールサポート</dt>
 <dd>ClojureScriptがネイティブにサポートしているGoogle Closure Library形式のモジュール(goog.module)以外が、ClojureScriptからより使いやすくなりました</dd>
 <dt>Externs inference</dt>
 <dd>ClojureScriptコンパイラが認識できないJavaScriptの名前を解決するための情報であるexternsファイルを、人手で書かなくてもコードに型ヒントを書くことで自動的に生成できるようになりました</dd>
 <dt>Macro inference</dt>
 <dd>これまで別の名前空間で定義されたマクロは、関数とは違う方法で`require`する必要がありましたが、コンパイラがこれを自動で判別してくれるようになりました</dd>

このあたりの話については以前にスライドにまとめているので、詳細についてはそちらを参照して下さい。

- [ここ最近のClojureScript ](https://speakerdeck.com/athos/kokozui-jin-falseclojurescript)

# Clojurists Together
コミュニティの動きとして個人的に興味深いと思ったのは Clojurists Together です。

*Clojurists Together* は個人または企業によってOSSとして開発されているClojureプロダクトをコミュニティで支援していく活動です。
Clojureを開発業務に使う企業は世界中で増えていて、その開発にはOSSのClojureライブラリやフレームワークがたくさん使われるのが当たり前になっています。しかし、それらのOSSはごく少人数の開発者によってメンテナンスされている場合がほとんどで、そのプロジェクトが存続し続けられるかは多くの場合個人の努力や献身に大きく依存しています。

この非常に危うい状況を打開し、Clojureのエコシステムさらにはコミュニティの持続可能性を高めようと立ち上がったのがこの Clojurists Together というプロジェクトです。Clojurists Together は個人や企業から出資を募り、あらかじめ登録されたOSSプロジェクトに資金を分配する仕組みを作ろうとしています。Rubyコミュニティで興った Ruby Together というプロジェクトが下敷きになっているようです。

現在、Clojurists Together はOSSプロジェクトの登録と出資者を募集している段階で、12/13までに出資者として登録すれば創立メンバーとして記録されるようなので、ClojureのOSSコミュニティに貢献したい方は登録してみてはいかがでしょうか？

- [Clojurists Together](https://clojuriststogether.org/)

# 日本コミュニティの盛り上がり
今年は日本でもClojureが(何度目かの)ひそかなブームを迎えた年でもありました。

まず、Clojureに関する新しい勉強会が続々と始まりました。関東圏で僕が把握しているだけでも次のような勉強会が今年新たに生まれました：

- [nishi-shinju-clojure](https://nishi-shinju-clojure.connpass.com/)
- [clojure.tokyo](https://www.meetup.com/ja-JP/clojure-tokyo/)
- [教養としてのClojure](https://d-cube.connpass.com/event/67567/)
- [clj-nakano](https://clj-nakano.connpass.com/)
- [clj-ebisu](https://connpass.com/event/66966/)

なかには平日開催ながら40〜50名程度を集めた比較的大きな勉強会もいくつかあり、活発さが感じられます。

仕事でClojureを使っているという方も少しずつ増えてきているようです。以下の「日本でClojure/ClojureScriptを利用している会社一覧」は、Erlang/Elixir界隈の[同様の取り組み](https://github.com/voluntas/japanese-erlang-elixir-companies)に触発されて個人的に作り始めたものですが、徐々に名前を連ねる企業が増えてきています。

- [日本で Clojure/ClojureScript を利用している会社一覧](http://github.com/athos/japanese-clojure-companies)

また、一番規模の大きいClojureカンファレンスであるClojureClojure/conjで、今年は日本からも発表される方がいました。日本のClojurianの今後の躍進にも期待が持てますね！

- [Sequence and Concurrent Processing for Huge Genomic Data](https://www.youtube.com/watch?v=ipNru1QSeWc&index=36&list=PLZdCLR02grLqCR8EKuil8NrffZuTl0kwL)
- [Poetry of Programming](https://www.youtube.com/watch?v=XRjPnuPv6xo)
- [Lighting Talk - Managing a Java Batch job with JobStreamer](https://www.youtube.com/watch?v=Vc6fqHl1g50&index=23&list=PLZdCLR02grLqCR8EKuil8NrffZuTl0kwL)

# まとめ
今年はClojureが誕生してから10周年の節目の年でした。日本でもにわかに盛り上がりを見せているのは非常に喜ばしいことだと思います。これからの10年もぜひ一緒に盛り上げていきましょう:laughing: