Side effect ordering in function call expressions
Consider the following code:
class Foo
fun fn(x: U64) => None
actor Main
new create(env: Env) =>
var x: U64 = 0
try foo()?.fn(x = 42) end
env.out.print(x.string())
fun foo(): Foo ? => error
What do you think it will print? Probably 0
right? Or maybe you realized this code is in the gotchas section so it must be 42
. If you went with 42
, you'd be right. Why?
Expressions for arguments in function calls are evaluated before the expression for the function receiver. The use of assignment expressions like x = 42
is quite rare so we don't think many folks will be bitten by this. However, it's definitely something you want to be aware of. Also remember that if fn
were to be called, it would be called with 0
(the result of the assignment expression).