+
+
+ 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/-bash-/bin/sh"`)
+
+ |
+
+
+
+
+ `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 `"/.config"`.
+
+ |
+
+
+
+
+ ``
+
+ |
+
+
+ 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).
+
+ |
+
+
diff --git a/doc/manual/source/language/meson.build b/doc/manual/source/language/meson.build
new file mode 100644
index 00000000000..97469e2f3bf
--- /dev/null
+++ b/doc/manual/source/language/meson.build
@@ -0,0 +1,20 @@
+builtins_md = custom_target(
+ command : [
+ python.full_path(),
+ '@INPUT0@',
+ '@OUTPUT@',
+ '--'
+ ] + nix_eval_for_docs + [
+ '--expr',
+ '(builtins.readFile @INPUT3@) + import @INPUT1@ (builtins.fromJSON (builtins.readFile ./@INPUT2@)) + (builtins.readFile @INPUT4@)',
+ ],
+ input : [
+ '../../remove_before_wrapper.py',
+ '../../generate-builtins.nix',
+ language_json,
+ 'builtins-prefix.md',
+ 'builtins-suffix.md'
+ ],
+ output : 'builtins.md',
+ env : nix_env_for_docs,
+)
diff --git a/doc/manual/source/language/operators.md b/doc/manual/source/language/operators.md
new file mode 100644
index 00000000000..dbf2441cb7c
--- /dev/null
+++ b/doc/manual/source/language/operators.md
@@ -0,0 +1,235 @@
+# Operators
+
+| Name | Syntax | Associativity | Precedence |
+|----------------------------------------|--------------------------------------------|---------------|------------|
+| [Attribute selection] | *attrset* `.` *attrpath* \[ `or` *expr* \] | none | 1 |
+| [Function application] | *func* *expr* | left | 2 |
+| [Arithmetic negation][arithmetic] | `-` *number* | none | 3 |
+| [Has attribute] | *attrset* `?` *attrpath* | none | 4 |
+| List concatenation | *list* `++` *list* | right | 5 |
+| [Multiplication][arithmetic] | *number* `*` *number* | left | 6 |
+| [Division][arithmetic] | *number* `/` *number* | left | 6 |
+| [Subtraction][arithmetic] | *number* `-` *number* | left | 7 |
+| [Addition][arithmetic] | *number* `+` *number* | left | 7 |
+| [String concatenation] | *string* `+` *string* | left | 7 |
+| [Path concatenation] | *path* `+` *path* | left | 7 |
+| [Path and string concatenation] | *path* `+` *string* | left | 7 |
+| [String and path concatenation] | *string* `+` *path* | left | 7 |
+| Logical negation (`NOT`) | `!` *bool* | none | 8 |
+| [Update] | *attrset* `//` *attrset* | right | 9 |
+| [Less than][Comparison] | *expr* `<` *expr* | none | 10 |
+| [Less than or equal to][Comparison] | *expr* `<=` *expr* | none | 10 |
+| [Greater than][Comparison] | *expr* `>` *expr* | none | 10 |
+| [Greater than or equal to][Comparison] | *expr* `>=` *expr* | none | 10 |
+| [Equality] | *expr* `==` *expr* | none | 11 |
+| Inequality | *expr* `!=` *expr* | none | 11 |
+| Logical conjunction (`AND`) | *bool* `&&` *bool* | left | 12 |
+| Logical disjunction (`OR`) | *bool*