4 ms·
The modern way of call/cc and shift/reset is using Effect Handlers instead [1]. If you are interested in this, Ningning Xie and I give a tutorial about effect
by daanx 5y ago
The modern way of call/cc and shift/reset is using Effect Handlers instead [1].
If you are interested in this, Ningning Xie and I give a tutorial about effect handlers (and more) at ICFP'21 tomorrow (Thursday 12:30 EST):
<https://icfp21.sigplan.org/details/icfp-2021-tutorials/5/Programming-with-Effect-Handlers-and-FBIP-in-Koka https://icfp21.sigplan.org/details/icfp-2021-tutorials/5/Pro...>
[1] <https://koka-lang.github.io/koka/doc/book.html https://koka-lang.github.io/koka/doc/book.html>
- rscho 5y agoInteresting! Can one have effect handlers in an untyped language such as scheme ?
- daanx 5y agoYes! a nice aspect of effect handlers is that they have an untyped dynamic semantics. Having said that, tracking effect types can be very beneficial, especially if you do interesting control flow like async/await for example.
- kazinator 5y agoI'm not convinced that effect handlers are other than (at most) just a different name for delimited continuations.
- jimsimmons 5y agoThey are much more structured than mere delimitation. That's the whole point
- daanx 5y agoI like the characterization that Andrej Bauer uses: "while relates to goto, as effect handlers to shift/reset" :-) That is, you indeed need delimited continuations to implement effect handlers, but they have more structure than, say, shift/reset. In particular, instead of being able to just yield (shift) with any function to an innermost context (reset), you can only perform a certain set of operations that are handled by a function defined in the handler. This gives various advantages, in particular, - you can give simple types to effect handlers (while shift/reset for example needs an answer type system), and you can use fine grained effect typing (instead of just a "shift" effect, you have "<exn,console>" effects) - you can do better reasoning as the set of operations is restricted - and (as a consequence) you have more opportunity to optimize them. In particular, tail-presumptive operations can be implemented to execute "in-place" without capturing the continuation for example. - finally, different effect handlers are compositional and can be combined freely (unlike shift/reset; for example shift aways shifts to the innermost reset so we cannot compose arbitrarily compose with multiple resets).