Navigation
Synopsis Assign but replace if value is not defined.
Syntax Assignable ? Exp2 = Exp1
Description First the value of Exp1 is determined and if that is defined it is assigned to Assignable. Otherwise, the value of Exp2 is assigned to Assignable. Values which can be undefined are values in Rascal/Expressions/Values/Maps where the key is not set or values of Annotations which have not been set yet.

No other values can be used in an undefined state, so the ? operator does not make sense on undefined or uninitialized variables for example.
Examples
rascal>M = ("Andy": 1, "Brian" : 2);
map[str, int]: ("Andy":1,"Brian":2)
Using an isDefined assignable can we increment a non-existing entry:
rascal>M["SomebodyElse"] ? 0 += 1;
map[str, int]: ("Andy":1,"Brian":2,"SomebodyElse":1)
rascal>M["SomebodyElse"];
int: 1
And if we increment an existing entry the ? has no effect:
rascal>M["Andy"] ? 0 += 1;
map[str, int]: ("Andy":2,"Brian":2,"SomebodyElse":1)
rascal>M["Andy"]
int: 2
Is this page unclear, or have you spotted an error? Please add a comment below and help us to improve it. For all other questions and remarks, visit ask.rascal-mpl.org.