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

関数の戻り値の型

関数の戻り値の型が指定できるようになりました。

引数の後に型を記述します。

struct Point { int x, y; }

function new_Point(x, y) : Point
{
  var ret = (Point)malloc(sizeof Point);
  ret.x = x;
  ret.y = y;
  return ret;
} 

returnで戻すretから型推論することができるため、関数の型指定を省略することができます。

struct Point { int x, y; }

function new_Point(x, y)
{
  var ret = (Point)malloc(sizeof Point);
  ret.x = x;
  ret.y = y;
  return ret;
}

var p = new_Point(1, 2);
printfln("typeof p = %s", typeof p); 

最後にあるpは型推論により関数new_Pointの戻り値の型になります。静的型付けのため、型が決定できなければメンバにアクセスできません。

関数は前方参照できます。ソースのパースは1パスのため、呼び出した時点で関数の戻り値の型は決定できません。そのため変数の型はパース時には不定として扱って、コード生成フェーズで必要に応じて型推論を行うように仕様を変更しました。

最終的な出力としては静的型付けですが、内部では動的型付けに近い処理をしています。