HaxeのマクロでPromise専用構文を作った
専用構文というか、マクロでF#のコンピュテーション式のサブセットライブラリ(Bind, Return, Zeroのみ)を実装して、その上にPromiseを載せたという表現の方が正確な説明です。
Promiseを使った非同期処理がこんな感じで書けます。hxgndでは、hxgnd.Promiseという独自実装のPromise型が提供されていますが、これはjs.Promiseと混在させることが可能です。
import hxgnd.Promise; class Main { public static function main() { Promise.compute({ var a = @await Promise.resolve(1); var b = @await js.Promise.resolve(2); var c = @await getValue(); (a + b + c) * 10; }).then(function (x) { trace(x); // 60 }); } static function getValue() { return new Promise(function (fulfill, _) { haxe.Timer.delay(function () fulfill(3), 100); }); } }
とりあえずこれがあれば、他人に無理やりHaxeを書かせる際に「Haxeってasync/awaitとかScalaのforがないじゃないですか」って言われるケースは封殺できるようになってめでたいです。あとはHaxe 4でアロー構文とfinalが入ってくるのを待つ感じです。