(type T () ...)に関しては未解決のbugがある. とりあえずこのbugに
遭遇しないための方法は, 相互再帰のように本当に必要となる場合を除
いて, これを使わないことである. つまり普段はできるだけ, 使用の前にきっ
ちり定義をする習慣をつけておくことである.
(deftyp T () ...)によって宣言されたABCL/fの型をコンパイラがCの
型に変換する時の方法は, ...部に何が書かれているかによって大きく
変わる. 例えば,
(deftype mass () (mass real))のような宣言を見た時, コンパイラは型
Tのデータはreal型と全く同じ
表現を持てばそれで十分であると判断して, 次のようなC++コードを出す.
typedef T real;一方例えば,
(deftype point () (point real real))のような場合, コンパイラはこのデータ型を2ワードのレコードへのポインタ として表現すると決断する. つまり,
typedef struct point_
{
real f0;
real f1;
} * point;
のようなコードを出す.
一方で, (type T ())にはそのようなT型の表現がどのようにな
るかを判断する基準がないから, 何も考えずに,
typedef struct T_ * T;としてしまう. これは, 上記の
point型の場合には問題を及ぼさないが,
mass型の場合, 明らかに問題となる.
現在, これに対してコンパイラが行なっていることは, 以下のような摩化不思 議なエラーメッセージを出すことだけである.
Syntax Error: Type mass has previously been declared by (declare-union-type ...), but now being defined as a transparent type