blob: ad9f623662470ab5d391106a70ede42ec208290f [file] [log] [blame] [view]
# Effects
Wuffs functions have one of three effects: pure, impure and coroutine. Pure
means that the function has no side effects - it does not change any observable
state. For example, the body of a pure function (with a `this` receiver) cannot
assign to a `this.foo` field. The other two categories may have side effects,
with [coroutines](/doc/note/coroutines.md) also being able to suspend and
resume.
Impure functions are marked with a `!` at their definition and at call sites.
Coroutines are similarly marked, with a `?`. Pure functions have no mark.
For those used to C/C++ syntax, in Wuffs, the unary not operator is spelled
`not` instead of `!`, and Wuffs has no ternary operator like C/C++'s `?:`.
Sub-expressions in Wuffs must be pure. Only the outermost function call can
have a `!` or `?` mark. You can't write:
```
foo!(bar(), baz!(), qux)
```
Instead, you have to explicitly split it.
```
b = baz!()
foo!(bar(), b, qux)
```
For similar reasons, `x += 1` is a statement in Wuffs, not an expression. This
avoids the ambiguous order of execution in C/C++'s `x = x++`, which is actually
undefined behavior.