An expression may be followed by one or both of (...) and {...}.
Note: If either is (...) or {...} present, it is a method call.
The {...} is appended to the argument list, and matches a formal of type Closure.
If there is no method member, a property (or field) is used instead, and must itself be callable.
If the methodCallArgs are absent, it is a property reference.
If there is no property, it is treated as a field reference, but never a method reference.
Arguments in the (...) can be labeled, and the appended block can be labeled also.
If there is a mix of unlabeled and labeled arguments,
all the labeled arguments must follow the unlabeled arguments,
except that the closure (labeled or not) is always a separate final argument.
Labeled arguments are collected up and passed as a single argument to a formal of type Map.
Therefore, f(x,y, a:p, b:q) {s} is equivalent in all ways to f(x,y, [a:p,b:q], {s}).
Spread arguments of sequence type count as unlabeled arguments,
while spread arguments of map type count as labeled arguments.
(This distinction must sometimes be checked dynamically.)
A plain unlabeled argument is allowed to match a trailing Map or Closure argument:
f(x, a:p) {s} === f(*[ x, [a:p], {s} ])