There’s this syntax trap that might confuse people. When I was doing a Nix talk (sorry no recording) and I showed them this slide, someone asked: How is that purely functional? The code in question is here for convenience:
{
a = 1;
b = {
x = 0;
};
}
Turns out at this point in time, when people see {}
and a = 1;
, they automatically think it’s a block with an assignment expression. It’s not! This is actually a complex literal equivalent to this JSON:
{
"a": 1,
"b": {
"x": 0
}
}
And you can abbreviate it to:
{
a = 1;
b.x = 0;
}
If you say b.x = 0;
and b.y = 1;
, they will ‘merge’ into a single b
, but you can’t say b.x
twice just like you can’t say a
twice. NixOS modules merging the configurations is a completely different mechanism at play.
nix repl
is a good place to play with the syntax of the language