aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/src/language/index.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/src/language/index.md')
-rw-r--r--doc/manual/src/language/index.md581
1 files changed, 581 insertions, 0 deletions
diff --git a/doc/manual/src/language/index.md b/doc/manual/src/language/index.md
new file mode 100644
index 000000000..db34fde75
--- /dev/null
+++ b/doc/manual/src/language/index.md
@@ -0,0 +1,581 @@
+# Nix Language
+
+The Nix language is
+
+- *domain-specific*
+
+ It only exists for the Nix package manager:
+ to describe packages and configurations as well as their variants and compositions.
+ It is not intended for general purpose use.
+
+- *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*
+
+ Expressions are only evaluated when their value is needed.
+
+- *dynamically typed*
+
+ Type errors are only detected when expressions are evaluated.
+
+# Overview
+
+This is an incomplete overview of language features, by example.
+
+<table>
+ <tr>
+ <th>
+ Example
+ </th>
+ <th>
+ Description
+ </th>
+ </tr>
+ <tr>
+ <td>
+
+
+ *Basic values*
+
+
+ </td>
+ <td>
+
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `"hello world"`
+
+ </td>
+ <td>
+
+ A string
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ ```
+ ''
+ multi
+ line
+ string
+ ''
+ ```
+
+ </td>
+ <td>
+
+ A multi-line string. Strips common prefixed whitespace. Evaluates to `"multi\n line\n string"`.
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `"hello ${ { a = "world" }.a }"`
+
+ `"1 2 ${toString 3}"`
+
+ `"${pkgs.bash}/bin/sh"`
+
+ </td>
+ <td>
+
+ String interpolation (expands to `"hello world"`, `"1 2 3"`, `"/nix/store/<hash>-bash-<version>/bin/sh"`)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `true`, `false`
+
+ </td>
+ <td>
+
+ Booleans
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `null`
+
+ </td>
+ <td>
+
+ Null value
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `123`
+
+ </td>
+ <td>
+
+ An integer
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `3.141`
+
+ </td>
+ <td>
+
+ A floating point number
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `/etc`
+
+ </td>
+ <td>
+
+ An absolute path
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `./foo.png`
+
+ </td>
+ <td>
+
+ A path relative to the file containing this Nix expression
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `~/.config`
+
+ </td>
+ <td>
+
+ A home path. Evaluates to the `"<user's home directory>/.config"`.
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ <nixpkgs>
+
+ </td>
+ <td>
+
+ Search path. Value determined by [`$NIX_PATH` environment variable](../command-ref/env-common.md#env-NIX_PATH).
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ *Compound values*
+
+ </td>
+ <td>
+
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x = 1; y = 2; }`
+
+ </td>
+ <td>
+
+ A set with attributes named `x` and `y`
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ foo.bar = 1; }`
+
+ </td>
+ <td>
+
+ A nested set, equivalent to `{ foo = { bar = 1; }; }`
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `rec { x = "foo"; y = x + "bar"; }`
+
+ </td>
+ <td>
+
+ A recursive set, equivalent to `{ x = "foo"; y = "foobar"; }`
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `[ "foo" "bar" "baz" ]`
+
+ `[ 1 2 3 ]`
+
+ `[ (f 1) { a = 1; b = 2; } [ "c" ] ]`
+
+ </td>
+ <td>
+
+ Lists with three elements.
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ *Operators*
+
+ </td>
+ <td>
+
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `"foo" + "bar"`
+
+ </td>
+ <td>
+
+ String concatenation
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `1 + 2`
+
+ </td>
+ <td>
+
+ Integer addition
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `"foo" == "f" + "oo"`
+
+ </td>
+ <td>
+
+ Equality test (evaluates to `true`)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `"foo" != "bar"`
+
+ </td>
+ <td>
+
+ Inequality test (evaluates to `true`)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `!true`
+
+ </td>
+ <td>
+
+ Boolean negation
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x = 1; y = 2; }.x`
+
+ </td>
+ <td>
+
+ Attribute selection (evaluates to `1`)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x = 1; y = 2; }.z or 3`
+
+ </td>
+ <td>
+
+ Attribute selection with default (evaluates to `3`)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x = 1; y = 2; } // { z = 3; }`
+
+ </td>
+ <td>
+
+ Merge two sets (attributes in the right-hand set taking precedence)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ *Control structures*
+
+ </td>
+ <td>
+
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `if 1 + 1 == 2 then "yes!" else "no!"`
+
+ </td>
+ <td>
+
+ Conditional expression
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `assert 1 + 1 == 2; "yes!"`
+
+ </td>
+ <td>
+
+ Assertion check (evaluates to `"yes!"`).
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `let x = "foo"; y = "bar"; in x + y`
+
+ </td>
+ <td>
+
+ Variable definition
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `with builtins; head [ 1 2 3 ]`
+
+ </td>
+ <td>
+
+ Add all attributes from the given set to the scope (evaluates to `1`)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ *Functions (lambdas)*
+
+ </td>
+ <td>
+
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `x: x + 1`
+
+ </td>
+ <td>
+
+ A function that expects an integer and returns it increased by 1
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `x: y: x + y`
+
+ </td>
+ <td>
+
+ Curried function, equivalent to `x: (y: x + y)`. Can be used like a function that takes two arguments and returns their sum.
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `(x: x + 1) 100`
+
+ </td>
+ <td>
+
+ A function call (evaluates to 101)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `let inc = x: x + 1; in inc (inc (inc 100))`
+
+ </td>
+ <td>
+
+ A function bound to a variable and subsequently called by name (evaluates to 103)
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x, y }: x + y`
+
+ </td>
+ <td>
+
+ A function that expects a set with required attributes `x` and `y` and concatenates them
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x, y ? "bar" }: x + y`
+
+ </td>
+ <td>
+
+ A function that expects a set with required attribute `x` and optional `y`, using `"bar"` as default value for `y`
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x, y, ... }: x + y`
+
+ </td>
+ <td>
+
+ A function that expects a set with required attributes `x` and `y` and ignores any other attributes
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `{ x, y } @ args: x + y`
+
+ `args @ { x, y }: x + y`
+
+ </td>
+ <td>
+
+ A function that expects a set with required attributes `x` and `y`, and binds the whole set to `args`
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ *Built-in functions*
+
+ </td>
+ <td>
+
+
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `import ./foo.nix`
+
+ </td>
+ <td>
+
+ Load and return Nix expression in given file
+
+ </td>
+ </tr>
+ <tr>
+ <td>
+
+ `map (x: x + x) [ 1 2 3 ]`
+
+ </td>
+ <td>
+
+ Apply a function to every element of a list (evaluates to `[ 2 4 6 ]`)
+
+ </td>
+ </tr>
+</table>