Callbacks, closures and forward declarations [language.proctypes]

Annotate proc type definitions and forward declarations with {.raises [Defect], gcsafe.} or specific exception types.

# By default, Nim assumes closures may raise any exception and are not gcsafe
# By annotating the callback with raises and gcsafe, the compiler ensures that
# any functions assigned to the closure fit the given constraints
type Callback = proc(...) {.raises: [Defect], gcsafe.}

Practical notes

  • Without annotations, raises Exception and no GC-safety is assumed by the compiler, infecting deduction in the whole call stack
  • Annotations constrain the functions being assigned to the callback to follow its declaration, simplifying calling the callback safely
    • In particular, callbacks are difficult to reason about when they raise exceptions - what should the caller of the callback do?