関数の戻り値の型が指定できるようになりました。
引数の後に型を記述します。
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パスのため、呼び出した時点で関数の戻り値の型は決定できません。そのため変数の型はパース時には不定として扱って、コード生成フェーズで必要に応じて型推論を行うように仕様を変更しました。
最終的な出力としては静的型付けですが、内部では動的型付けに近い処理をしています。