Next: Up: Previous:

宣言

もの事をbottom upに書いていくというのが一般的な指針だが, 時にはそうし たくない場合や, 実際に不可能な場合もある(相互再帰の場合). そのような場 合は, あるものを定義を伴わずに宣言だけしておくことができる(Pascalの forward宣言に類似している). 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 ()
  ...)
の形で定義されることを宣言している.





Mitsubishi Research Institute,Inc.
Thu Feb 27 20:14:12 JST 1997