Clojure Language Update 2016

今年もアドベントカレンダーの季節がやってきました。
これは [Clojure Advent Calendar](http://qiita.com/advent-calendar/2016/clojure) 1日目の記事です。まずは初日ということで、今年1年間でClojure/ClojureScript界隈であったことを振り返っていきましょう。

## Clojure 1.8リリース
まず今年の1月にはClojure 1.8のリリースがありました。1.8はダイレクトリンクとソケットサーバREPLが目玉のリリースでした。

ダイレクトリンクはClojureでの関数呼び出しをコンパイルする新しい方式で、関数呼び出しに関わるVarの参照を取り除くことで、関数呼び出しの効率やClojureの起動時間を改善します。
ソケットサーバREPLは、コードを変更しなくてもClojureの起動オプションを指定するだけでTCPで待ち受けるREPLサーバを立ち上げられるようになる機能です。

詳しい内容については手前味噌ですが下の記事で解説しています。

- [Clojure Language Update 2015 〜一年の出来事と1.8の機能紹介〜](http://qiita.com/athos/items/726ff7486da045b511bc)

## clojure.spec登場

今年のClojureのトピックで最もインパクトがあったのはclojure.specがアナウンスされたことでしょう。

clojure.specは次期リリース1.9で導入される新機能で、いろいろな用途に使うことができる組み込みのバリデーションライブラリと考えることができます。[Schema](https://github.com/plumatic/schema)というライブラリ(Clojureコミュニティで広く使われているバリデーションライブラリ)を知っていれば、clojure.specがカバーする範囲はSchemaと重なる部分が多いことに気づくでしょう。
clojure.specでは述語、つまり真偽値を返す関数を組み合わせた「スペック」によってデータの仕様を記述します。また、関数の入力と出力のスペックを定義することで契約プログラミングのようなことが実現できます。
clojure.specはデータのバリデーションだけでなくClojureコードの構文解析にも使用できます。これはClojureコードがデータと見なせることによるもので、受理できる構文をスペックとして記述することにより、複雑な構文をもつマクロを定義することも可能です。
さらに、一度定義したスペックは生成的テスト(generative testing)に利用することもできます。つまり、スペックを満たすデータをランダムに生成し、テストに使うことができるのです。

このように、clojure.specの用途は多岐に渡り、また開発工程の様々な場面で使用できるため、Clojureにおける開発方法を大きく変えるポテンシャルを持っています。また、スペックを満たさなかった場合に発生するエラーは、どこが間違っていたかをかなり詳細に報告してくれるため、これまで課題だったClojureのエラーメッセージの貧弱さが改善される可能性もあり、期待感をもって受け入れられています。

clojure.specについて詳しくは以下が参考になるかもしれません。

- [clojure.spec Rationale and Overview](http://clojure.org/about/spec)
- [Clojure spec Guide](http://clojure.org/guides/spec)
- [Cognicast Episode 103 clojure.spec with Rich Hickey](http://blog.cognitect.com/cognicast/103)
- [clojure.spec入門1](http://ykomatsu0.hatenablog.com/entry/introduction-to-clojure-spec-1)
- [clojure.spec入門2](http://ykomatsu0.hatenablog.com/entry/introduction-to-clojure-spec-2)
- [clojure.specの話 Speaker Deck](https://speakerdeck.com/athos/clojure-dot-specfalsehua-1)

## ClojureScriptのアップデート

Clojureがclojure.specの開発に時間がかかっている中、多くのリリースを重ねてめざましい改善がなされたのがClojureScriptでした。特に、`ns`マクロに関するClojureとの互換性がかなり向上しました。

これまでのClojureScriptでは、マクロがClojureScriptでなくClojureで書かれているという違いから、何が関数で何がマクロかを意識しながら`:require`と`:require-macros`を使い分ける必要がありました。
最近のClojureScriptのアップデートにより、いくつかの条件を満たせばコンパイラが自動的にどの名前がマクロかを判別してくれるようになり、`:require-macros`を使わなくてもよくなりました。
また、`cljs.test`のように、これまで`cljs.*`を使わなければいけなかった名前空間が`clojure.*`でもrequireできるようになった改善も含め、これらの互換性向上によってClojure/ClojureScript間でのコードの共有が格段にやりやすくなりました。

このあたりの詳細についてはPlanckの開発者の方のブログ記事が分かりやすいです。

- [ClojureScript Macro Sugar](http://blog.fikesfarm.com/posts/2016-03-01-clojurescript-macro-sugar.html)
- [ClojureScript clojure Namespace Aliasing](http://blog.fikesfarm.com/posts/2016-07-03-clojurescript-clojure-namespace-aliasing.html)

## clojure.orgリニューアル

Clojure/ClojureScript本体以外のニュースでは [clojure.org](http://clojure.org/) のサイトリニューアルがありました。デザインが刷新された他、修正のプロセスが見直されました。ClojureのContribution Agreementに同意していれば、[GitHub](https://github.com/clojure/clojure-site)上からプルリクエストで修正を提案できます。
またこれと前後して、これまでWikiしかなかったClojureScriptに新たに公式サイトとして [clojurescript.org](http://clojurescript.org/) が用意されました。こちらもclojure.orgと同様にプルリクエストを送ることができるようです。

## Arachne開発開始

コミュニティの動きとして興味深かったものでは、Arachneという[クラウドファンディングで4.5万ドル集めた](https://www.kickstarter.com/projects/1346708779/arachne-rapid-web-development-for-clojure)Webフレームワークの登場がありました。

Clojure界隈ではフルスタックのWebフレームワークよりも単機能のライブラリを組み合わせてアプリケーションを構築する方が好まれる傾向があります。実際、フルスタックのWebフレームワークはあまりメジャーではありません。しかし、この状況は新規開発者の参入を難しくしているだけでなく、Clojureに慣れた開発者であってもアプリケーションを素早く作り上げるのを困難にしている側面もあります。
Arachneはこの問題に向き合い、新規開発者にもやさしく迅速な開発にも使えて、なおかつモジュールの組み換えによって容易に拡張できるWebフレームワークを実現することをゴールとして開発が進められています。

Arachne自体はまだ開発途上の段階であり、実際に使ってみることはできませんが、今後の展開に期待です。

- [Arachne GitHub](https://github.com/arachne-framework)

## カンファレンス

Clojureのカンファレンスもいくつか新しいものが増えてきました。

なかでも、完全にオンラインでのカンファレンスという試みのClojure Remoteが目を引きました。オンラインながら、2日間20弱程度の発表が並ぶわりと本格的なカンファレンスで、Clojure界隈で有名な人をパネリストに迎えたパネルディスカッションは他に例がないおもしろい取り組みだと思います。ちなみに、今年もClojure Remote 2017として2/9, 10に開催されるようです。

- [Clojure Remote](https://clojureremote.com/)
- [Clojure Remote YouTube動画](https://www.youtube.com/playlist?list=PLPgnbBCmP6ZMfHPJ4yMwuoLEZvEe5LVe8&__s=tqcp7hpnmsbavxcvqqu7)

オフラインのカンファレンスでは、つい先日11/26にインドで初めて大きなClojureカンファレンスが開かれたようです。アジア圏では数少ない例ですね。

- [IN/Clojure](http://inclojure.org/)

## 新しく発刊された本

最後に今年新しく発刊されたClojure本の紹介です。

- [Clojure in Action 2nd Edition](https://www.amazon.co.jp/dp/1617291528/ref=cm_sw_su_dp)
- [Clojure for Finance](https://www.amazon.co.jp/dp/1785289284/ref=cm_sw_su_dp)
- [Clojure for Java Developers](https://www.amazon.co.jp/dp/B019OP7JIW/ref=cm_sw_su_dp)
- [Mastering Clojure](https://www.amazon.co.jp/dp/B017XSFL4Q/ref=cm_sw_su_dp)
- [Professional Clojure](https://www.amazon.co.jp/dp/1119267277/ref=cm_sw_su_dp)
- [Web Development With Clojure 2nd Edition](https://www.amazon.co.jp/dp/1680500821/ref=cm_sw_su_dp)
- [ClojureScript Unraveled](https://leanpub.com/clojurescript-unraveled)
- [Clojure Programming Cookbook](https://www.amazon.co.jp/Clojure-Programming-Cookbook-Makoto-Hashimoto-ebook/dp/B01DT4D5LY)

また、Programming Clojureの第3版がClojure開発コアメンバーのAlex Millerを迎えて[準備されている](https://pragprog.com/book/shcloj3/programming-clojure-3rd-edition)ようなのでこちらも要チェックです。

- 参考：http://clojure.org/community/books

## まとめ

さて、海の向こうオースティンでは今日からClojure/conj 2016が開催されますが、はたして今年はどういった発表があるのでしょうか。

今年は1.9のリリースを控えて比較的おだやかだったClojure/ClojureScript界隈ですが、clojure.specリリース後はcore.asyncが公開された直後に匹敵する盛り上がりを見せるのではないかと予想されます。公開が楽しみですね！！