/home/matstani/weblog

programming log.

[Clojure] lein-typed

lein-typedを利用すると、core.typedライブラリを利用したClojureプログラムの静的型チェックをLeiningenタスクとして実行できます。

インストール

全てのプロジェクトで利用する場合

~/.lein/profiles.clj:user :plugins[lein-typed "0.3.0"]を追記します。(ファイルが存在しない場合は新規作成)
例)

1
{:user {:plugins [[lein-typed "0.3.0"]]}}

特定のプロジェクトで利用する場合

project.clj:plugins[lein-typed "0.3.0"]を追記します。

型チェックの実行

project.cljにチェック対象となるnamespaceを記述します。
例)

1
2
3
4
5
6
7
8
9
10
(defproject try-typed "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.5.1"]
                 [org.clojure/core.typed "0.2.3"]]
  :plugins [[lein-typed "0.3.0"]] 
  ; 対象namespaceを指定
  :core.typed {:check [try-typed.core]})

静的型チェックを実行します。

1
2
3
4
5
6
7
8
9
10
$ lein typed check
Initializing core.typed ...
"Elapsed time: 11563.779405 msecs"
core.typed initialized.
Start collecting try-typed.core
Finished collecting try-typed.core
Collected 1 namespaces in 11658.922614 msecs
Start checking try-typed.core
Checked try-typed.core in 423.743596 msecs
Checked 1 namespaces (approx. 33 lines) in 12087.276047 msecs

checkの替わりにcoverageを指定すると、型指定annotationの網羅率を表示します。

1
2
3
4
5
6
7
8
9
10
lein typed coverage
Initializing core.typed ...
"Elapsed time: 3286.597969 msecs"
core.typed initialized.
Start collecting try-typed.core
Finished collecting try-typed.core
Collected 1 namespaces in 3383.256821 msecs
Checked 0 namespaces (approx. 0 lines) in 3385.801947 msecs
Found 4 annotated vars out of 4 vars
100% var annotation coverage

Comments