aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/src/language
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/src/language')
-rw-r--r--doc/manual/src/language/advanced-attributes.md31
-rw-r--r--doc/manual/src/language/builtin-constants-prefix.md5
-rw-r--r--doc/manual/src/language/builtin-constants-suffix.md1
-rw-r--r--doc/manual/src/language/builtin-constants.md20
-rw-r--r--doc/manual/src/language/builtins-prefix.md20
-rw-r--r--doc/manual/src/language/constructs.md98
-rw-r--r--doc/manual/src/language/derivations.md2
-rw-r--r--doc/manual/src/language/index.md9
-rw-r--r--doc/manual/src/language/operators.md11
-rw-r--r--doc/manual/src/language/values.md26
10 files changed, 127 insertions, 96 deletions
diff --git a/doc/manual/src/language/advanced-attributes.md b/doc/manual/src/language/advanced-attributes.md
index 5a63236e5..5e8aaeba0 100644
--- a/doc/manual/src/language/advanced-attributes.md
+++ b/doc/manual/src/language/advanced-attributes.md
@@ -198,8 +198,7 @@ Derivations can declare some infrequently used optional attributes.
- `"recursive"`\
The hash is computed over the NAR archive dump of the output
- (i.e., the result of [`nix-store
- --dump`](../command-ref/nix-store.md#operation---dump)). In
+ (i.e., the result of [`nix-store --dump`](@docroot@/command-ref/nix-store/dump.md)). In
this case, the output can be anything, including a directory
tree.
@@ -209,12 +208,26 @@ Derivations can declare some infrequently used optional attributes.
about converting to and from base-32 notation.)
- [`__contentAddressed`]{#adv-attr-__contentAddressed}
- If this **experimental** attribute is set to true, then the derivation
+ > **Warning**
+ > This attribute is part of an [experimental feature](@docroot@/contributing/experimental-features.md).
+ >
+ > To use this attribute, you must enable the
+ > [`ca-derivations`](@docroot@/contributing/experimental-features.md#xp-feature-ca-derivations) experimental feature.
+ > For example, in [nix.conf](../command-ref/conf-file.md) you could add:
+ >
+ > ```
+ > extra-experimental-features = ca-derivations
+ > ```
+
+ If this attribute is set to `true`, then the derivation
outputs will be stored in a content-addressed location rather than the
traditional input-addressed one.
- This only has an effect if the `ca-derivations` experimental feature is enabled.
- Setting this attribute also requires setting `outputHashMode` and `outputHashAlgo` like for *fixed-output derivations* (see above).
+ Setting this attribute also requires setting
+ [`outputHashMode`](#adv-attr-outputHashMode)
+ and
+ [`outputHashAlgo`](#adv-attr-outputHashAlgo)
+ like for *fixed-output derivations* (see above).
- [`passAsFile`]{#adv-attr-passAsFile}\
A list of names of attributes that should be passed via files rather
@@ -307,14 +320,6 @@ Derivations can declare some infrequently used optional attributes.
```
- [`unsafeDiscardReferences`]{#adv-attr-unsafeDiscardReferences}\
- > **Warning**
- > This is an experimental feature.
- >
- > To enable it, add the following to [nix.conf](../command-ref/conf-file.md):
- >
- > ```
- > extra-experimental-features = discard-references
- > ```
When using [structured attributes](#adv-attr-structuredAttrs), the
attribute `unsafeDiscardReferences` is an attribute set with a boolean value for each output name.
diff --git a/doc/manual/src/language/builtin-constants-prefix.md b/doc/manual/src/language/builtin-constants-prefix.md
new file mode 100644
index 000000000..50f43006d
--- /dev/null
+++ b/doc/manual/src/language/builtin-constants-prefix.md
@@ -0,0 +1,5 @@
+# Built-in Constants
+
+These constants are built into the Nix language evaluator:
+
+<dl>
diff --git a/doc/manual/src/language/builtin-constants-suffix.md b/doc/manual/src/language/builtin-constants-suffix.md
new file mode 100644
index 000000000..a74db2857
--- /dev/null
+++ b/doc/manual/src/language/builtin-constants-suffix.md
@@ -0,0 +1 @@
+</dl>
diff --git a/doc/manual/src/language/builtin-constants.md b/doc/manual/src/language/builtin-constants.md
deleted file mode 100644
index 78d066a82..000000000
--- a/doc/manual/src/language/builtin-constants.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Built-in Constants
-
-Here are the constants built into the Nix expression evaluator:
-
- - `builtins`\
- The set `builtins` contains all the built-in functions and values.
- You can use `builtins` to test for the availability of features in
- the Nix installation, e.g.,
-
- ```nix
- if builtins ? getEnv then builtins.getEnv "PATH" else ""
- ```
-
- This allows a Nix expression to fall back gracefully on older Nix
- installations that don’t have the desired built-in function.
-
- - [`builtins.currentSystem`]{#builtins-currentSystem}\
- The built-in value `currentSystem` evaluates to the Nix platform
- identifier for the Nix installation on which the expression is being
- evaluated, such as `"i686-linux"` or `"x86_64-darwin"`.
diff --git a/doc/manual/src/language/builtins-prefix.md b/doc/manual/src/language/builtins-prefix.md
index c631a8453..7b2321466 100644
--- a/doc/manual/src/language/builtins-prefix.md
+++ b/doc/manual/src/language/builtins-prefix.md
@@ -1,16 +1,16 @@
# Built-in Functions
-This section lists the functions built into the Nix expression
-evaluator. (The built-in function `derivation` is discussed above.)
-Some built-ins, such as `derivation`, are always in scope of every Nix
-expression; you can just access them right away. But to prevent
-polluting the namespace too much, most built-ins are not in
-scope. Instead, you can access them through the `builtins` built-in
-value, which is a set that contains all built-in functions and values.
-For instance, `derivation` is also available as `builtins.derivation`.
+This section lists the functions built into the Nix language evaluator.
+All built-in functions are available through the global [`builtins`](./builtin-constants.md#builtins-builtins) constant.
+
+For convenience, some built-ins can be accessed directly:
+
+- [`derivation`](#builtins-derivation)
+- [`import`](#builtins-import)
+- [`abort`](#builtins-abort)
+- [`throw`](#builtins-throw)
<dl>
- <dt><code>derivation <var>attrs</var></code>;
- <code>builtins.derivation <var>attrs</var></code></dt>
+ <dt id="builtins-derivation"><a href="#builtins-derivation"><code>derivation <var>attrs</var></code></a></dt>
<dd><p><var>derivation</var> is described in
<a href="derivations.md">its own section</a>.</p></dd>
diff --git a/doc/manual/src/language/constructs.md b/doc/manual/src/language/constructs.md
index 1c01f2cc7..a3590f55d 100644
--- a/doc/manual/src/language/constructs.md
+++ b/doc/manual/src/language/constructs.md
@@ -2,8 +2,11 @@
## Recursive sets
-Recursive sets are just normal sets, but the attributes can refer to
-each other. For example,
+Recursive sets are like normal [attribute sets](./values.md#attribute-set), but the attributes can refer to each other.
+
+> *rec-attrset* = `rec {` [ *name* `=` *expr* `;` `]`... `}`
+
+Example:
```nix
rec {
@@ -12,7 +15,9 @@ rec {
}.x
```
-evaluates to `123`. Note that without `rec` the binding `x = y;` would
+This evaluates to `123`.
+
+Note that without `rec` the binding `x = y;` would
refer to the variable `y` in the surrounding scope, if one exists, and
would be invalid if no such variable exists. That is, in a normal
(non-recursive) set, attributes are not added to the lexical scope; in a
@@ -33,7 +38,10 @@ will crash with an `infinite recursion encountered` error message.
## Let-expressions
A let-expression allows you to define local variables for an expression.
-For instance,
+
+> *let-in* = `let` [ *identifier* = *expr* ]... `in` *expr*
+
+Example:
```nix
let
@@ -42,18 +50,19 @@ let
in x + y
```
-evaluates to `"foobar"`.
+This evaluates to `"foobar"`.
## Inheriting attributes
-When defining a set or in a let-expression it is often convenient to
-copy variables from the surrounding lexical scope (e.g., when you want
-to propagate attributes). This can be shortened using the `inherit`
-keyword. For instance,
+When defining an [attribute set](./values.md#attribute-set) or in a [let-expression](#let-expressions) it is often convenient to copy variables from the surrounding lexical scope (e.g., when you want to propagate attributes).
+This can be shortened using the `inherit` keyword.
+
+Example:
```nix
let x = 123; in
-{ inherit x;
+{
+ inherit x;
y = 456;
}
```
@@ -62,23 +71,31 @@ is equivalent to
```nix
let x = 123; in
-{ x = x;
+{
+ x = x;
y = 456;
}
```
-and both evaluate to `{ x = 123; y = 456; }`. (Note that this works
-because `x` is added to the lexical scope by the `let` construct.) It is
-also possible to inherit attributes from another set. For instance, in
-this fragment from `all-packages.nix`,
+and both evaluate to `{ x = 123; y = 456; }`.
+
+> **Note**
+>
+> This works because `x` is added to the lexical scope by the `let` construct.
+
+It is also possible to inherit attributes from another attribute set.
+
+Example:
+
+In this fragment from `all-packages.nix`,
```nix
graphviz = (import ../tools/graphics/graphviz) {
inherit fetchurl stdenv libpng libjpeg expat x11 yacc;
- inherit (xlibs) libXaw;
+ inherit (xorg) libXaw;
};
-xlibs = {
+xorg = {
libX11 = ...;
libXaw = ...;
...
@@ -92,7 +109,7 @@ libjpg = ...;
the set used in the function call to the function defined in
`../tools/graphics/graphviz` inherits a number of variables from the
surrounding scope (`fetchurl` ... `yacc`), but also inherits `libXaw`
-(the X Athena Widgets) from the `xlibs` (X11 client-side libraries) set.
+(the X Athena Widgets) from the `xorg` set.
Summarizing the fragment
@@ -191,30 +208,41 @@ three kinds of patterns:
```nix
{ x, y, z, ... } @ args: z + y + x + args.a
```
-
- Here `args` is bound to the entire argument, which is further
- matched against the pattern `{ x, y, z,
- ... }`. `@`-pattern makes mainly sense with an ellipsis(`...`) as
+
+ Here `args` is bound to the argument *as passed*, which is further
+ matched against the pattern `{ x, y, z, ... }`.
+ The `@`-pattern makes mainly sense with an ellipsis(`...`) as
you can access attribute names as `a`, using `args.a`, which was
given as an additional attribute to the function.
-
+
> **Warning**
- >
- > The `args@` expression is bound to the argument passed to the
- > function which means that attributes with defaults that aren't
- > explicitly specified in the function call won't cause an
- > evaluation error, but won't exist in `args`.
- >
+ >
+ > `args@` binds the name `args` to the attribute set that is passed to the function.
+ > In particular, `args` does *not* include any default values specified with `?` in the function's set pattern.
+ >
> For instance
- >
+ >
> ```nix
> let
- > function = args@{ a ? 23, ... }: args;
+ > f = args@{ a ? 23, ... }: [ a args ];
> in
- > function {}
- > ````
- >
- > will evaluate to an empty attribute set.
+ > f {}
+ > ```
+ >
+ > is equivalent to
+ >
+ > ```nix
+ > let
+ > f = args @ { ... }: [ (args.a or 23) args ];
+ > in
+ > f {}
+ > ```
+ >
+ > and both expressions will evaluate to:
+ >
+ > ```nix
+ > [ 23 {} ]
+ > ```
Note that functions do not have names. If you want to give them a name,
you can bind them to an attribute, e.g.,
diff --git a/doc/manual/src/language/derivations.md b/doc/manual/src/language/derivations.md
index 043a38191..79a09122a 100644
--- a/doc/manual/src/language/derivations.md
+++ b/doc/manual/src/language/derivations.md
@@ -17,7 +17,7 @@ the attributes of which specify the inputs of the build.
string. This is used as a symbolic name for the package by
`nix-env`, and it is appended to the output paths of the derivation.
- - There must be an attribute named `builder` that identifies the
+ - There must be an attribute named [`builder`]{#attr-builder} that identifies the
program that is executed to perform the build. It can be either a
derivation or a source (a local file reference, e.g.,
`./builder.sh`).
diff --git a/doc/manual/src/language/index.md b/doc/manual/src/language/index.md
index 3eabe1a02..29950a52d 100644
--- a/doc/manual/src/language/index.md
+++ b/doc/manual/src/language/index.md
@@ -1,12 +1,11 @@
# Nix Language
-The Nix language is
+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.
+It 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.
+ 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*
@@ -25,7 +24,7 @@ The Nix language is
- *lazy*
- Expressions are only evaluated when their value is needed.
+ Values are only computed when they are needed.
- *dynamically typed*
diff --git a/doc/manual/src/language/operators.md b/doc/manual/src/language/operators.md
index 90b325597..f8382ae19 100644
--- a/doc/manual/src/language/operators.md
+++ b/doc/manual/src/language/operators.md
@@ -35,17 +35,14 @@
## Attribute selection
-Select the attribute denoted by attribute path *attrpath* from [attribute set] *attrset*.
-If the attribute doesn’t exist, return *value* if provided, otherwise abort evaluation.
+> *attrset* `.` *attrpath* \[ `or` *expr* \]
-<!-- FIXME: the following should to into its own language syntax section, but that needs more work to fit in well -->
+Select the attribute denoted by attribute path *attrpath* from [attribute set] *attrset*.
+If the attribute doesn’t exist, return the *expr* after `or` if provided, otherwise abort evaluation.
-An attribute path is a dot-separated list of attribute names.
-An attribute name can be an identifier or a string.
+An attribute path is a dot-separated list of [attribute names](./values.md#attribute-set).
> *attrpath* = *name* [ `.` *name* ]...
-> *name* = *identifier* | *string*
-> *identifier* ~ `[a-zA-Z_][a-zA-Z0-9_'-]*`
[Attribute selection]: #attribute-selection
diff --git a/doc/manual/src/language/values.md b/doc/manual/src/language/values.md
index c85124278..2ae3e143a 100644
--- a/doc/manual/src/language/values.md
+++ b/doc/manual/src/language/values.md
@@ -164,9 +164,17 @@ Note that lists are only lazy in values, and they are strict in length.
An attribute set is a collection of name-value-pairs (called *attributes*) enclosed in curly brackets (`{ }`).
+An attribute name can be an identifier or a [string](#string).
+An identifier must start with a letter (`a-z`, `A-Z`) or underscore (`_`), and can otherwise contain letters (`a-z`, `A-Z`), numbers (`0-9`), underscores (`_`), apostrophes (`'`), or dashes (`-`).
+
+> *name* = *identifier* | *string* \
+> *identifier* ~ `[a-zA-Z_][a-zA-Z0-9_'-]*`
+
Names and values are separated by an equal sign (`=`).
Each value is an arbitrary expression terminated by a semicolon (`;`).
+> *attrset* = `{` [ *name* `=` *expr* `;` `]`... `}`
+
Attributes can appear in any order.
An attribute name may only occur once.
@@ -182,21 +190,29 @@ Example:
This defines a set with attributes named `x`, `text`, `y`.
-Attributes can be selected from a set using the `.` operator. For
-instance,
+Attributes can be accessed with the [`.` operator](./operators.md#attribute-selection).
+
+Example:
```nix
{ a = "Foo"; b = "Bar"; }.a
```
-evaluates to `"Foo"`. It is possible to provide a default value in an
-attribute selection using the `or` keyword. For example,
+This evaluates to `"Foo"`.
+
+It is possible to provide a default value in an attribute selection using the `or` keyword.
+
+Example:
```nix
{ a = "Foo"; b = "Bar"; }.c or "Xyzzy"
```
-will evaluate to `"Xyzzy"` because there is no `c` attribute in the set.
+```nix
+{ a = "Foo"; b = "Bar"; }.c.d.e.f.g or "Xyzzy"
+```
+
+will both evaluate to `"Xyzzy"` because there is no `c` attribute in the set.
You can use arbitrary double-quoted strings as attribute names: