defun, defmethod, defclass, deftype, それ
ぞれに対して, 中身を書かずに後に定義が行なわれるということだけを宣言す
る, fun, method, class, typeが用意されてい
る. それらは構文的にはそれぞれdefun, defmethod,
defclass, deftype の「中身」を取り去ったものになっている.
例えば, 先の例で, どうしてもgを, fの前に
定義したければ, 次のようにすることができる.
(fun f (x) (declare (fixnum x) (reply-type fixnum))) (defun g (x) (declare (fixnum x) (reply-type fixnum)) (+ (f x) 1)) (defun f (x) (declare (fixnum x) (reply-type fixnum)) (+ x 1))
(fun f (x)
(declare (fixnum x) (reply-type fixnum))) は, 後にfが同じ型
のdefunで定義されることを宣言している.
同様の関係は型に関してもなり立つ. 例えば二つの, 互いに相手を参照し合う
クラス, A, Bを作りたい場合を考える.
(defclass A () (B y)) (defclass B () (A x))しかしこれは,
Bの宣言の前にAを使用しているのでエラーとな
る. その場合,
(class B ())を
Aの定義の前に付け加えればうまくいく. (class B ())は
Bが後に,
(defclass B () ...)という形で定義されるのだということを宣言している. 同様に,
(type B ())と書けばそれは,
Bが後に
(deftype B () ...)の形で定義されることを宣言している.