awaitとcall/cc
awaitは現在の継続を与えられたPromiseの後に接続するだけであって、継続をユーザに露出するわけではない
awaitの挙動をcall/ccで真似ることはできそうだが逆は無理そう
こんな記事があった
tslet p = new Promise((resolve) => {
console.log("promise called", resolve);
// @ts-ignore
window.resolve = resolve;
});
(async () => {
console.log("before await")
console.log(await p);
console.log("after await")
})()
// before await を表示して処理を中断
window.resolve(42)
// 42
// after await // 中断されていた処理が再開される
// undefined
window.resolve(53)
// undefined // 2回目以降は何も起こらない
scheme(define resolve #f)
(define (p c)
(print "promise called")
(print c)
(set! resolve c))
gosh> (begin
(print "before call/cc")
(print (call/cc p))
(print "after call/cc"))
;before call/cc
;promise called
;#<subr "continuation">
;#<subr "continuation">
;after call/cc
;#<undef>
;処理は最後まで実行される
gosh> resolve
#<subr "continuation">
gosh> (resolve 42)
42
after call/cc
#<undef>
;再度実行される
gosh> (resolve 53)
53
after call/cc
#<undef>
;何度でも実行される