#:g1: trivial-typesの紹介

Posted 2014-05-22 06:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の142日目です。

trivial-typesとはなにか

 trivial-typesは、Tomohiro Matsuyama(@m2ym)氏による型関係のユーティリティです。

パッケージ情報

パッケージ名trivial-types
Quicklisp
参考サイト括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
Quickdocshttp://quickdocs.org/trivial-types

インストール方法

(ql:quickload :trivial-types)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 大まかに言ってしまうと、Common Lispで良く使いそうな型の定義と、desinator等の、概念はあるけれど簡単な記法がないものを纏めたものです。

 以下が良く使いそうな型の定義。基本的に述語を作成して、satisfiesと組み合せる方式のようです。

(typep '(a . b) 'proper-list)
;=>  NIL

(typep '(a b) 'proper-list)
;=>  T

(typep '((a . b) (c . d)) 'association-list) ;=> T

(typep '(a b c d) 'property-list) ;=> T

(typep '(a b c . d) 'property-list) ;=> NIL

(typep '(a b) '(tuple symbol symbol)) ;=> T

 次にdesinator系。

(typep #\c 'character-designator)
;=>  T

(typep "c" 'character-designator) ;=> T

(typep 'list 'function-designator) ;=> T

(typep '(setf car) 'function-designator) ;=> NIL

(typep 0 'file-position-designator) ;=> T (typep -1 'file-position-designator) ;=> NIL

(typep :start 'file-position-designator) ;=> T (typep :end 'file-position-designator) ;=> T

function-designatorは今のところ拡張(extended function designator)の方への対応はなしの模様。
file-position-designatorで:start :endなんてものが使えたんですね。勉強になります。
他、pathnameとしてfile-associated-streamが使えたりもします。

 次にユーティリティ系

(type-expand 'file-position-designator)
;=>  (OR (MEMBER :START :END) (INTEGER 0))
;    T

(type-specifier-p 'proper-list) ;=> "Equivalent to `(and list (satisfies proper-list-p))`. ELEMENT-TYPE ; is just ignored. ; ; Examples: ; ; (typep '(1 2 3) '(proper-list integer)) => T ; (typep '(1 2 3) '(proper-list string)) => T"

 type-specifier-pの結果が若干謎ですが、返り値がgeneralized booleanということでしょうか。処理系依存の機能(SBCLであればsb-ext:valid-type-specifier-pのような)を使わなくても判定したいということだったのかもしれません。

まとめ

 今回は、trivial-typesを紹介してみました。
SBCL等型のチェックを比較的厳しめにできる処理系であれば、型チェックを活用していくのは有効かなと思います。
そういう場合には便利に使えそうなユーティリティですね。

comments powered by Disqus