There are 2 versions of do, one with nothing between do and : (do:), and one with routine-like features, such as do (param) {.pragma.} -> returnType:.
The do: version is like : in that it represents a statement list argument, however it works inside other expressions. For example (quote do: a) is the same as quote(a), however (quote: a) is a named tuple with a quote field of value a.
The routine version represents a trailing anonymous proc argument. Sometimes the do: version gets transformed into this one but this is deprecated in current 2.0.