#:g1: glintの紹介

Posted 2014-10-20 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の294日目です。

glintとはなにか

 glintは、Naoki Koguro氏作のGauche用のコードチェッカーです。

パッケージ情報

パッケージ名glint
プロジェクトサイトglint

インストール方法

 プロジェクトサイトからダウンロードしてきて、configure/make/make installでglintコマンドが生成されます。

 Gauche 0.8.13用とのことで、最新のGaucheでは動作未確認かと思います。

試してみる

 glintがリリースされたのは、2008年のことで早6年前になりますが、当時開催のgauche.night #2での発表の動画がありますので、これを観るのが一番分かりやすいかなと思います。

 glintではGauche内部の中間表現を元にチェックしているのでGaucheの実際の動作に即した詳細な結果が得られます。

 一応、以前のsclintの例+αで比べてみると、

(define (foo x)
  (if (= x 0)
	1
           (foo (- x 1))))

(if 1 2 3 4)

(define)

(let () a)

(if (= car x 0) a b)

(define morlis (lambda (x) x))

(define (morlis y) y)

;; (use srfi-42) (list-ec (: e '(1 2 3 4)) e)

のようなものだと、

$ glint /tmp/foo.scm
/tmp/foo.scm:6: error: syntax-error: malformed if: (if 1 2 3 4)
/tmp/foo.scm:8: error: syntax-error: (define)
/tmp/foo.scm:10: error: a(user) referenced but not defined
/tmp/foo.scm:12: error: a(user) referenced but not defined
/tmp/foo.scm:12: error: b(user) referenced but not defined
/tmp/foo.scm:12: error: x(user) referenced but not defined
/tmp/foo.scm:20: error: #<generic object-apply (8)> can't be applied with arguments (: #<unidentified> (1 2 3 4))
/tmp/foo.scm:20: error: e(user) referenced but not defined
/tmp/foo.scm:20: error: list-ec(user) referenced but not defined

のような感じになります。
(use srfi-42)を有効にすれば、

/tmp/foo.scm:6: error: syntax-error: malformed if: (if 1 2 3 4)
/tmp/foo.scm:8: error: syntax-error: (define)
/tmp/foo.scm:10: error: a(user) referenced but not defined
/tmp/foo.scm:12: error: a(user) referenced but not defined
/tmp/foo.scm:12: error: b(user) referenced but not defined
/tmp/foo.scm:12: error: x(user) referenced but not defined

のようにエラーも減少します。

まとめ

 今回は、glintを紹介してみました。
動画のデモにもありますが、Emacsのflymakeからも使えるようになっていて便利そうです。

comments powered by Disqus