Shammer's Philosophy

My private adversaria

declareとは

たまに人が書いたLispのコードを見ると、declare というのを使っている。CLHSの解説は以下だが

A declare expression, sometimes called a declaration, can occur only at the beginning of the bodies of certain forms; that is, it may be preceded only by other declare expressions, or by a documentation string if the context permits.

正直よく理解できず。これがなんなのかよくわからないので調べてみよう、と思ったら、ちょうど同じことをしているサイトを発見。

Common Lispのdeclareについて

どうやら、変数の型を指定するもののようだ。ALCによれば declare の直訳は「宣言する」だからな、、、なるほど。引数の型の指定は defmethod では可能だが、内部で let で確保したものとかは初期値を参考にするしかない。つまり、初期値がないとなるとロジックから判断するしかないということ。あえて型を指定せずに色々な引数を渡しても処理できるように柔軟にする場合もあれば、引数を固定にして処理速度を上げたい場合もある。引数を固定したいというときに使用する、と覚えておこう。LispでList分割 - Shammerismで書いた half に declare を使用してみた例。

? (defun half (l)
  (declare (list l))
  (if (evenp (length l))
      (values (subseq l 0 (/ (length l) 2))
	      (subseq l (/ (length l) 2)))
    (values (subseq l 0 (/ (- (length l) 1) 2))
	    (subseq l (/ (- (length l) 1) 2)))))
HALF
? (half '(0 1 2 3))
(0 1)
(2 3)
?

declare の引数は、typespec として定義されたものを使用できるらしいが。。。list もそうなのだろうか。以下のようなことができるので、おそらく list も大丈夫なのだと思われる。

? (typep '(0 1 2) 'list)
T
?