Kokaの例: async/await
現状(2023/5/25)は、実際に動くものは触れなさそう
primitiveにそういう機能が用意されていない
async effectを定義する
code:koka(ts)
effect async
ctl readline(): string
readlineという1行読み込むinterfaceを用意しておく
Koka処理系のホスト言語としてNode.jsを想定する
Node.jsの実装をwrapしたものとしてprim-readlineを定義する
code:koka(ts)
fun prim-readline(oninput: string -> ()): io ()
undefined
1行読み込んで、成功したらcallbackを実行する関数
handlerを用意する
code:koka(ts)
fun outer-async()
with handler
ctl readline() prim-readline(resume)
async effectのreadlineが呼ばれたら、処理系のprim-readlineを呼ぶだけ
ここで、callbackにresumeを渡すことで、成功すると処理が戻ってくるようにしている
こんな感じで使える
code:koka(ts)
fun ask-name(): <async,console> ()
println("whah is your name?")
val name = readline()
println("hello " ++ name)
readline()はasync関数だが、通常の関数と同じように呼べる
JSだとawait readline()のように書かないといけなかった
また、JSだとasync funcitonはasync functionの中でしか呼べなかった
algebraic effectがあればその制限を取っ払い、どこでも呼べる
内部でasync functionを呼ぶと、その情報がeffect typeに乗るというだけ。
すごいmrsekut.icon*4