Commom Lisp : 型指定子

[id:lethevert:20050720:p1]で、関数の定義域や値域を、型そのものが持っているものよりも狭めてやることで、不要な範囲チェックや例外処理を書かなくてもよくなるのではないか、というような話を書きました。(これって、今考えると、証明(形式検証)の一種だよね、と言う話は[id:lethevert:20051128:p4]に書いた話)
最近、Common Lispを勉強していて、型指定子というものを見つけました。

(deftype naturalnumber ()
  '(and integer (satisfies (< 0))))

という風に書けば、整数の中でも0より大きい数(つまり自然数)を示す型指定子が定義できるそうです。
また、型に名前が要らなければ、

(and integer (satisfies (< 0)))

と書けば、自然数の集合をあらわすことができるそうです。
ということは、これを使ってやれば、定義域や値域を表現することができそう。(ただし、Lispには型チェックがないので、そのままでは無理ですが)