#:g1: SCLINTの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の288日目です。

SCLINTとはなにか

 SCLINTは、Pertti Kellomäki氏作のScheme(R4RS)版のLintです。

パッケージ情報

パッケージ名SCLINT
CMU AI レポジトリPackage: lang/scheme/code/debug/sclint/

インストール方法

 ダウンロードしてきて展開するだけで使えますが、実行スクリプトではscmで実行するようになっています。

試してみる

 こんな感じの、foo.scmというファイルがあったとして、

(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)

$ sclint foo.scm

でチェックすると

sclint v. 0.9, Pertti Kellomaki 1992
Reading source files: /home/mc/sclint/foo.scm, done.
Checking indentation...done.
Checking special forms and argument counts...done.
foo.scm:3:Indentation does not match the logical structure.
foo.scm:4:Indentation does not match the logical structure.
foo.scm:7:Wrong number of subexpressions in if.
foo.scm:10:Missing variable and expression in a define form.
foo.scm:13:No bindings in a binding list. You should probably use begin instead.
foo.scm:16:Variable not defined in lexical context: x
foo.scm:17:Variable not defined in lexical context: a
foo.scm:18:Variable not defined in lexical context: b
foo.scm:21:Duplicate definition of morlis
foo.scm:24:Duplicate definition of morlis

のような感じでチェックしてくれます。
チェックしてくれるポイントですが、

あたりのようです。
コードを眺めると移植性が高そうだったのでSagittariusで実行してみましたが、そのまま実行できるようです。
こんな感じにシェルスクリプトにできます。

#!/usr/bin/env sash

(import (rnrs))

(define SCLINTHOME ".../sclint/")

(for-each (lambda (f) (load (string-append SCLINTHOME f))) '("pexpr.scm" "read.scm" "environ.scm" "special.scm" "procs.scm" "top-level.scm" "checkarg.scm" "sclint.scm" "match.scm" "indent.scm"))

(sclint (cdr (command-line)))

まとめ

 今回は、SCLINTを紹介してみました。
1992年のものということで大分古いものですが、割合に今でも使えそうです。
主に教育目的での利用を想定しているとのことですが、入門あたりなら全然使えそうではあります。

comments powered by Disqus