Clojure 1.6.0リリース

前置き

Clojureの新バージョン1.6.0が、2014-03-25にリリースされました。ソースはGitHubにあるので、そこのchanges.mdを見ると変更点が分かります。個人的に気になる点をピックアップしてみます。

Java API

JavaからClojureのコードを呼ぶためのAPIが公開されました。クラスとインターフェイスが1つずつです。

  • clojure.java.api.Clojureクラス
  • clojure.lang.IFnインターフェイス
使用例
IFn map = Clojure.var("clojure.core", "map");
IFn inc = Clojure.var("clojure.core", "inc");
map.invoke(inc, Clojure.read("[1 2 3]"));

Clojureクラスのvar()メソッドにより、Varにバインドされた関数オブジェクトを得ます。var()が返すのは、IFnインターフェイスです。関数を呼ぶには、IFnのinvoke()を使います。Clojure.read()メソッドを使えば、リテラル表記したClojureオブジェクトを得ることができます。

Destructuringでの名前空間修飾

associativeな構造を、:keysや :symsでDestructuringするとき、キー(キーワードやシンボル)が名前空間修飾されていてもOKになりました。

(let [m {:x/a 1, :y/b 2}
      {:keys [x/a y/b]} m]
  (+ a b))

(let [m {'x/a 1, 'y/b 2}
      {:syms [x/a y/b]} m]
  (+ a b))

このとき、受けるローカル変数(上記例のx/aやy/b)も表記上は名前空間修飾しますが、あくまでもローカル変数です。

さらに :keysでは、受けるローカル変数名として、シンボルではなく、キーワードを使うことができます。これにより、マップのキーが :: で始まるキーワードの場合でもDestructuringできるようになります。

(let [m {::x 1}
      {:keys [::x]} m]
  x)

clojure.core

非nilかどうかに関わる関数が追加されました。

  • some? ...非nilか?
  • if-some ...if-letのsome?版
  • when-some ...when-letのsome?版

また、ハッシュ関連とビット演算関連の関数が追加されています。

その他

コンパイル時に *warn-on-reflection* が真ならリフレクション警告が出るようになりますが、このメッセージに型情報が含まれるようになったみたいですね。どこに型ヒントを追加するべきか、分かりやすくなるかな?

Last modified:2014/06/25 00:09:47
Keyword(s):
References:[「Clojure Essentials」] [FP: 関数型プログラミング]
This page is frozen.