Language

String
``````let
h = "Hello";
value = 4;
in
{
helloWorld = "\${h} \${toString value} the win!"; (1)
}``````
 1 interpolation of the `toString` builtin function to convert an int value
List
``[ 123 ./foo.nix "abc" (f { x = y; }) ]``
Attribute Set
``````let x = 12;
y = 34;
f = {n}: 5 + n;
in
rec {
r = { inherit x y; (1)
text = "Hello";
add = f { n = 56; }; (2)
};
hello = r.text or "World"; (3)
b = r ? x; (4)
}``````
 1 when defining a set it is often convenient to copy variables from the surrounding lexical scope 2 all `;` are mandatory 3 Sets accessor using `.` Default using `or` 4 does the record 'r' contains an attribute 'x' `?`
Function
``pattern: body``
``````# `min` and `max` are available in stdenv.lib
min = x: y: if x < y then x else y; (1)``````
 1 pattern is a func returning a func (2 arguments)
``````{stdenv, fetchurl, perl, ... }: (1)

stdenv.mkDerivation { (2)
name = "hello-2.1.1";
...
};``````
 1 pattern is a set of arguments the 'ellipsis' (`…​`) allows the passing of a bigger set, one that contains more than the 3 required arguments. 2 function call passing a set as argument
Common functions
``````listToAttrs (1)
[ { name = "foo"; value = 123; }
{ name = "bar"; value = 456; }
]``````
 1 alike fromList from Haskell except there is no tuple type in Nix
With
``with e1; e2``

Introduces all attributes of the set `e1` into the lexical scope of the expression `e2`:

``````let as = { x = "foo"; y = "bar"; };
in
foobar = with as; x + y``````
Optional argument
``{ x, y ? "foo", z ? "bar" }: z + y + x (1)``
 1 a function that only requires an attribute named x, but optionally accepts y and z.
Merge sets
``e1 // e2 # merge e1 and e2 with e2 taking precedence in case of equally named attribute``
Logical implication
``e1 -> e2 (1)``
 1 if e1 is false, return true else check that e2 is true otherwise return false (in order word return e2). Useful with assert