# Nix Language The Nix language is designed for conveniently creating and composing *derivations* – precise descriptions of how contents of existing files are used to derive new files. > **Tip** > > These pages are written as a reference. > If you are learning Nix, nix.dev has a good [introduction to the Nix language](https://nix.dev/tutorials/nix-language). The language is: - *domain-specific* It comes with [built-in functions](@docroot@/language/builtins.md) to integrate with the Nix store, which manages files and performs the derivations declared in the Nix language. - *declarative* There is no notion of executing sequential steps. Dependencies between operations are established only through data. - *pure* Values cannot change during computation. Functions always produce the same output if their input does not change. - *functional* Functions are like any other value. Functions can be assigned to names, taken as arguments, or returned by functions. - *lazy* Values are only computed when they are needed. - *dynamically typed* Type errors are only detected when expressions are evaluated. # Overview This is an incomplete overview of language features, by example.
Example | Description |
---|---|
*Basic values ([primitives](@docroot@/language/types.md#primitives))* | |
`"hello world"` | A [string](@docroot@/language/types.md#type-string) |
``` '' multi line string '' ``` | A multi-line string. Strips common prefixed whitespace. Evaluates to `"multi\n line\n string"`. |
`# Explanation` | A [comment](@docroot@/language/syntax.md#comments). |
`"hello ${ { a = "world"; }.a }"` `"1 2 ${toString 3}"` `"${pkgs.bash}/bin/sh"` |
[String interpolation](@docroot@/language/string-interpolation.md) (expands to `"hello world"`, `"1 2 3"`, `"/nix/store/ |
`true`, `false` | [Booleans](@docroot@/language/types.md#type-boolean) |
`null` | [Null](@docroot@/language/types.md#type-null) value |
`123` | An [integer](@docroot@/language/types.md#type-int) |
`3.141` | A [floating point number](@docroot@/language/types.md#type-float) |
`/etc` | An absolute [path](@docroot@/language/types.md#type-path) |
`./foo.png` | A [path](@docroot@/language/types.md#type-path) relative to the file containing this Nix expression |
`~/.config` |
A home [path](@docroot@/language/types.md#type-path). Evaluates to the `" |
` |
A [lookup path](@docroot@/language/constructs/lookup-path.md) for Nix files. Value determined by [`$NIX_PATH` environment variable](../command-ref/env-common.md#env-NIX_PATH). |
*Compound values* | |
`{ x = 1; y = 2; }` | An [attribute set](@docroot@/language/types.md#attribute-set) with attributes named `x` and `y` |
`{ foo.bar = 1; }` | A nested set, equivalent to `{ foo = { bar = 1; }; }` |
`rec { x = "foo"; y = x + "bar"; }` | A [recursive set](@docroot@/language/syntax.md#recursive-sets), equivalent to `{ x = "foo"; y = "foobar"; }`. |
`[ "foo" "bar" "baz" ]` `[ 1 2 3 ]` `[ (f 1) { a = 1; b = 2; } [ "c" ] ]` | [Lists](@docroot@/language/types.md#list) with three elements. |
*Operators* | |
`"foo" + "bar"` | String concatenation |
`1 + 2` | Integer addition |
`"foo" == "f" + "oo"` | Equality test (evaluates to `true`) |
`"foo" != "bar"` | Inequality test (evaluates to `true`) |
`!true` | Boolean negation |
`{ x = 1; y = 2; }.x` | [Attribute selection](@docroot@/language/types.md#attribute-set) (evaluates to `1`) |
`{ x = 1; y = 2; }.z or 3` | [Attribute selection](@docroot@/language/types.md#attribute-set) with default (evaluates to `3`) |
`{ x = 1; y = 2; } // { z = 3; }` | Merge two sets (attributes in the right-hand set taking precedence) |
*Control structures* | |
`if 1 + 1 == 2 then "yes!" else "no!"` | [Conditional expression](@docroot@/language/syntax.md#conditionals). |
`assert 1 + 1 == 2; "yes!"` | [Assertion](@docroot@/language/syntax.md#assertions) check (evaluates to `"yes!"`). |
`let x = "foo"; y = "bar"; in x + y` | Variable definition. See [`let`-expressions](@docroot@/language/syntax.md#let-expressions). |
`with builtins; head [ 1 2 3 ]` | Add all attributes from the given set to the scope (evaluates to `1`). See [`with`-expressions](@docroot@/language/syntax.md#with-expressions) for details and shadowing caveats. |
`inherit pkgs src;` | Adds the variables to the current scope (attribute set or `let` binding). Desugars to `pkgs = pkgs; src = src;`. See [Inheriting attributes](@docroot@/language/syntax.md#inheriting-attributes). |
`inherit (pkgs) lib stdenv;` | Adds the attributes, from the attribute set in parentheses, to the current scope (attribute set or `let` binding). Desugars to `lib = pkgs.lib; stdenv = pkgs.stdenv;`. See [Inheriting attributes](@docroot@/language/syntax.md#inheriting-attributes). |
*[Functions](@docroot@/language/syntax.md#functions) (lambdas)* | |
`x: x + 1` | A [function](@docroot@/language/syntax.md#functions) that expects an integer and returns it increased by 1. |
`x: y: x + y` | Curried [function](@docroot@/language/syntax.md#functions), equivalent to `x: (y: x + y)`. Can be used like a function that takes two arguments and returns their sum. |
`(x: x + 1) 100` | A [function](@docroot@/language/syntax.md#functions) call (evaluates to 101) |
`let inc = x: x + 1; in inc (inc (inc 100))` | A [function](@docroot@/language/syntax.md#functions) bound to a variable and subsequently called by name (evaluates to 103) |
`{ x, y }: x + y` | A [function](@docroot@/language/syntax.md#functions) that expects a set with required attributes `x` and `y` and concatenates them |
`{ x, y ? "bar" }: x + y` | A [function](@docroot@/language/syntax.md#functions) that expects a set with required attribute `x` and optional `y`, using `"bar"` as default value for `y` |
`{ x, y, ... }: x + y` | A [function](@docroot@/language/syntax.md#functions) that expects a set with required attributes `x` and `y` and ignores any other attributes |
`{ x, y } @ args: x + y` `args @ { x, y }: x + y` | A [function](@docroot@/language/syntax.md#functions) that expects a set with required attributes `x` and `y`, and binds the whole set to `args` |
*Built-in functions* | |
`import ./foo.nix` | Load and return Nix expression in given file. See [import](@docroot@/language/builtins.md#builtins-import). |
`map (x: x + x) [ 1 2 3 ]` | Apply a function to every element of a list (evaluates to `[ 2 4 6 ]`). See [`map`](@docroot@/language/builtins.md#builtins-map). |