Nix Language Quirks: Difference between revisions
imported>Danbst added old let syntax |
imported>Danbst added function argument destructuring |
||
Line 31: | Line 31: | ||
Note, that it isn't equivalent to <code>with rec { x = 1; y = x + 1; body = y; }; body</code> because of mentioned <code>with</code> and <code>let</code> quirk, but is same as <code>rec { x = 1; y = x + 1; body = y; }.body</code> | Note, that it isn't equivalent to <code>with rec { x = 1; y = x + 1; body = y; }; body</code> because of mentioned <code>with</code> and <code>let</code> quirk, but is same as <code>rec { x = 1; y = x + 1; body = y; }.body</code> | ||
== Something that looks like both record attribute and <code>let</code>-binding == | |||
Destructuring function argument - is a great feature of Nix. | |||
<nowiki> | |||
nix-repl> f = { x ? 1, y ? 2 }: x + y | |||
nix-repl> f { } | |||
3</nowiki> | |||
The fact that we can add <code>@args</code> argument assignment is also cool | |||
<nowiki> | |||
nix-repl> f = { x ? 1, y ? 2, ... }@args: with args; x + y + z | |||
nix-repl> f { z = 3; } | |||
6</nowiki> | |||
But don't be fooled, <code>args</code> doesn't necessarily contain <code>x</code> and <code>y</code>: | |||
<nowiki> | |||
nix-repl> f = { x ? 1, y ? 2, ... }@args: args.x + args.y + args.z | |||
nix-repl> f { z = 3;} | |||
error: attribute ‘x’ missing, at (string):1:30</nowiki> | |||
These <code>x</code> and <code>y</code> are in fact <code>let</code>-bindings, but overridable ones. |
Revision as of 10:27, 26 October 2017
with
and let
with
gets less priority then let
. This can lead to confusions, especially if you like to write with pkgs;
:
nix-repl> pkgs = { x = 1; } nix-repl> with pkgs; x 1 nix-repl> with pkgs; let x = 2; in x 2
So we see, that let
binding overrides with
binding. But what about this?
nix-repl> let x = 2; in with pkgs; x 2
Nah, with
and let
have different priority when resolving names.
Old let
syntax
This is an old Nix syntax, that probably isn't used much
nix-repl> let { x = 1; y = x + 1; body = y; } 2
It is equivalent to modern syntax expression let x = 1; y = x + 1; in y
. Note, that it doesn't require rec
keyword.
Note, that it isn't equivalent to with rec { x = 1; y = x + 1; body = y; }; body
because of mentioned with
and let
quirk, but is same as rec { x = 1; y = x + 1; body = y; }.body
Something that looks like both record attribute and let
-binding
Destructuring function argument - is a great feature of Nix.
nix-repl> f = { x ? 1, y ? 2 }: x + y nix-repl> f { } 3
The fact that we can add @args
argument assignment is also cool
nix-repl> f = { x ? 1, y ? 2, ... }@args: with args; x + y + z nix-repl> f { z = 3; } 6
But don't be fooled, args
doesn't necessarily contain x
and y
:
nix-repl> f = { x ? 1, y ? 2, ... }@args: args.x + args.y + args.z nix-repl> f { z = 3;} error: attribute ‘x’ missing, at (string):1:30
These x
and y
are in fact let
-bindings, but overridable ones.