Next: Up: Previous:

Known Bug:

(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



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