【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

コンストラクタ・デストラクタ

LLPMLでコンストラクタとデストラクタをサポートしました。

C++C#では、クラス名を変更したときにコンストラクタやデストラクタも変更する必要があります。これがいつも面倒だと感じていました。そのためD言語の仕様を真似て、クラス名に関係なく常にthis(コンストラクタ)と~this(デストラクタ)を使用することにしました。

コンストラク

LLPMLではC言語との相互運用性のためマングリングを避けています。関数をオーバーロードすることができないので、コンストラクタは一種類しか作れません。そのためコンストラクタの引数は禁止しました。

今までのLLPMLでは構造体のインスタンス宣言時にメンバの値を列挙して代入できます。これを引数の代用と見なして、コンストラクタは代入の後に呼ぶようにしました。ただしコンストラクタでメンバを初期化している場合、事前の代入は無意味になります。この辺は運用で区別すれば特に問題はないでしょう。

デストラク

breakやreturnで脱出するときにデストラクタをどう処理するかで手間取りました。任意の場所で自動変数を初期化できる仕様のため、breakした時点で初期化されていない変数のデストラクタを呼ばないようにする必要があります。そのためデストラクタをブロックの最後で一括処理すると、フラグ等で管理することになります。構造体にフラグを持たせるとC言語との互換性がなくなってAPI呼び出し等で困るため、フラグを持たせるならスタックの方が良さそうです。しかしそうすると構造体の外に管理領域が分散するという問題が起こります。

結局、breakしたその場でデストラクタを呼び出すコードを生成することにしました。脱出するブロックが何重にもなっている場合は、上位ブロックのデストラクタもすべて処理してからスタックを戻してジャンプします。多少コードが冗長になりますが、フラグではなくコード上の位置で状態を管理していると考えることにします。