NISHIO Hirokazu[Translate]
awaitとcall/cc
Promiseawaitcall/ccはよく似ているが、call/ccは処理を止めず、Promiseは再実行できない
awaitは現在の継続を与えられたPromiseの後に接続するだけであって、継続をユーザに露出するわけではない
awaitの挙動をcall/ccで真似ることはできそうだが逆は無理そう
こんな記事があった

ts
let 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> ;何度でも実行される

"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]