Function Invocation - caffeine-suite/caffeine-script GitHub Wiki
Related: Function Definition
Explicit Function Invocation
Math.round(123.456)
Math.random() # functions with no params must be invoked this way
Implicit, One-Line Function Invocation
Any value, A, followed by a value, B, after it on the same line is treated as a function invocation: A(B).
Math.round 123.456
Any value, A, can also be followed by a Value-List, to pass more than one parameter to the function invocation:
# explicit value list
Math.round 123.456, 0.1
Lastly, commas are optional after atomic literals (strings, numbers, ...):
# implicit value list
Math.round 123.456 0.1
Implicit Block Function Invocation
Any value (a) followed by a block invokes (a) as a function. Each statement in the block is an argument to that function.
Math.round
123.456
Block Ambiguities Resolved
Full block-function-invocation have traditionally been hard to implement because of the ambiguities between invocation-blocks and control blocks.
# is this:
if foo
bar
# (a) this? (javascript)
if (foo(bar)) {}
# or (b) this? (javascript)
if (foo) {bar}
To resolve this, CaffeineScript gives if
, or any other similar control-block priority. The above example resolves to option (b).
Here are some more complex examples:
if foo
bar
baz
# == if (foo(bar)) {baz}
foo
bar
baz
# == foo(bar(baz))
Tail-ifs followed by a block are no longer tail-ifs:
a if b
c
# == a(b ? c : undefined)
And the ultimate example:
# Below not recommended :)
if a
b
c
d
e
# == if (a(b(c))(d)) {e}