async/await って本当に限定継続か?
async/await が本当に限定継続のための構文であるとすれば,以下の方法で(ワンショットな)限定継続を取り出すことができるはず code:dcont.ts
async f(): Promise<string> {
console.log(1)
const x = await new Promise(async k => {
console.log(2)
await k(42)
console.log(4)
})
console.log(3)
return ${x}
}
ここでkが本当に限定継続であるなら,(x: number) => Promise<R>のような型を持ち,1 -> 2 -> 3 -> 4 の順で出力されるはず
実際はkの型は(x: number) => voidであり,出力順も 1 -> 2 -> 3 -> 4 である
というか結果型に相当するものを捨てているわけでこれでは全く限定継続ではない
つまり,処理を切り取れていない
Promise コンストラクタの渡す関数は処理をタスクキューに入れるだけであって処理の終了までは管理してくれない
処理を切り取る方法として Explicit Resource Management (いわゆる using 構文)があるが,これはレキシカルスコープに紐付いていて関数スコープに紐付かないので
限定継続を実現するための言語機能の1つとして見ることはできるが
タスクを切り出し,止める役割として見ることはできる