BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース core.typed: Clojureにオプションの型システムを追加する

core.typed: Clojureにオプションの型システムを追加する

ブックマーク

原文(投稿日:2013/10/07)へのリンク

core.typedは動的型付けのClojureにオプションとしての型システムを追加する。目指しているのは、Clojureの簡潔さと柔軟性に、型チェッカーが提供する安全性の保証を加えることで、両方の世界のいいとこ取りをすることだ。型システムはオプションなので、最も有効なところに徐々に使っていくことができる。core.typedのユーザガイドによると、

型は、適切なdoc-stringと相まって、マシンでチェック可能なすぐれたドキュメントです。決して古くなることがなく、関数がやることのリマインダとしても貴重な情報になります。

プログラムが大きくなってくると、型があることが役立ちます。複数の人が関わるときは、なおさらです。もしコードが型システムをパスすれば、型について正しいことがわかります(プログラミングにおいて、型エラーは最もよくあるユーザエラーの1つです)。

Core.typedは型推論を使って多数の型を自動的に理解し、明示的な型アノテーションを必要とするのは変数と関数パラメータだけだ。また、プロトコルやデータタイプをアノテーション付けすることもできる。たとえば、2つの数を足し合わせる関数のアノテーションは、次のようになる。

(ann add [Number Number -> Number])
(defn add [a b]
  (+ a b))

型宣言は実装と分離されているため、サードパーティ製のコードにも簡単に型アノテーションを追加できる。たとえば、clojure.coreに追加することもできる

core.typedの作者であるAmbrose Bonnaire-Sergeant氏は、現在のバージョン0.2は製品に使えるレベル、つまり「実際のコードにはバグがあるかもしれませんが、既存のコードを遅くすることはありません」と言う。APIも安定しているはずだ。

InfoQでは、どうしてcore.typedを始めたのか、彼に話を聞いた。

このプロジェクトは、西オーストラリア大学のコンピュータサイエンス学科における私のUndergraduate Honoursプロジェクトとして始めました。私はSam Tobin-Hochstadt氏のTyped Racketから着想を得ました。これがTyped Clojureの理論と実装の大部分の源泉となっています。(編集者注: Typed Clojureとはcore.typedの以前の名前)

InfoQ: 検証に関して、core.typedにはたくさんのユニットテストがありますね。あなたの型チェッカーは正式に検証しましたか?(core.typedはcore.typedを使っているのですか?) 

どんなプロジェクトであっても、検証テクニックを組み合わせることは有用だと思います。core.typedは主にユニットテストを使って検証していますが、実装の型チェックも始めています。

型チェッカーは幅広く適用可能で、ほかの検証テクニックの利用に関する特性を静的に検証することもできます。たとえば、もしcore.typedとPrismatic氏のSchemaがお互いを知れば、Schemaを使ったランタイムテストが型エラーを避けるのに十分かどうか、core.typedでチェックできます。

もっと興味深い特性として、Typed Clojureはヌルポインタ例外がないことJavaの相互運用性の正しさimmutable bindingの正しい使用などをコンパイル時にチェックすることができます。

すぐれたテストカバレッジによってコード本体を型チェックすることは、バグを見つけるのに必ずしも必要ありませんが、型のないコードを型のあるコードに変換することは、コードレビューに似ていると思います。型システムはコードがどれくらい複雑であるかの良い尺度としても使えます。もし型が多岐にわたり混乱していれば、おそらくリファクタリングすべきときです。型が混乱しているということは、ロジックが混乱しているということでしょう。

InfoQ: Scalaプログラマから見ると、一部の型の名前が似ているようです。Scalaにもローカルな型推論がありますが、Scalaはcore.typedに影響を与えたのでしょうか? 

確かに、影響を受けています。Typed ClojureはJavaコードとうまく結びついており、配列の共変性やヌルポインタのようなJavaの型システムの特異な振る舞いを、Scalaがどのように扱っているのか比べることは役に立ちました。

Scalaには少し嫉妬しています。Odersky氏の「Colored Local Type Inference」はローカルな型推論のすぐれた拡張であり、Scalaプログラマは特定のアノテーションを省略できます。Typed ClojureとTyped Racketは別の方法でローカルな型推論を拡張していますが、特定のアノテーションを不要にするために、「Colored Local Type Inference」のような拡張には目を配っています。

InfoQ: Clojureコミュニティからはどんなフィードバックがありましたか? 

反応をうれしく思っています。Clojureプログラマは、プログラムを構築するときに自由に使える、パワフルで完全にオプションな型システムを待ち望んでいたことがわかりました。

InfoQ: 次のバージョンの計画は?

フルタイムでTyped Clojureを開発するためのクラウドファンディング・キャンペーンの一部として、当座の計画を挙げています。

次の変更で私が気に入っているのは、型チェックのターゲットとしてClojurescriptをサポートすること、静的な型に基づいた実行時規約の生成、セルフホストしたClojureコンパイラをターゲットとすること、Typed Clojureができることの枠を広げることです。

core.typedについて、詳しくはプロジェクトのWebサイトを訪れるか、このワークショップのビデオを見てみよう。core.typedが気に入ったなら、Ambrose氏のクラウドファンディング・キャンペーンへの支援を忘れずに。

この記事に星をつける

おすすめ度
スタイル

BT