私は受け取るコンパイラ警告の質と量を改善しようとしています -- Common Lisp で、宣言された型とインスタンスに型述語を含める方法はありますか -- 実装固有の回答は問題ありません。興味があります。誰かがやっているなら、それがどのように行われるかを見てください。
CCL で以下をコンパイルします。
(defun non-list (o)
(not (listp o)))
(deftype non-list ()
'(satisfies non-list))
(defun example (a)
(list a))
(declaim (ftype (function (non-list) list) example))
(defun hmm ()
(declare (optimize (debug 3) (safety 3)))
(let ((a '(a b c))
(b '(d e f)))
(declare (type list a))
(example '(g h i))
(example a)
(example b)))
への最初の呼び出しでコンパイラ警告が表示されますexample
-- に対してチェックできるインスタンスを提供するものsatisfies
です。これは良いことです。デバッグ設定を使用すると、実行時エラーが発生しますが、これは良いことです。私が疑問に思っているのは、次のようなものを書くことができるかどうかです。
(defun non-list-typep (type)
(not (subtypep type 'list)))
そして、少なくとも2番目の呼び出しが宣言された型が述語に失敗するため、コンパイル(example a)
時に警告するように何らかの方法で統合しますlist
non-list-typep
乾杯!