aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/src/command-ref
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-08 03:05:47 +0100
committereldritch horrors <pennae@lix.systems>2024-03-09 03:50:06 +0100
commit512c1f05c37c612347dd1fda4771a09744a1a3cd (patch)
tree9ae77da1a45060b12520326b426efc5014a51c0b /doc/manual/src/command-ref
parent0e8f505f666d9b0714840e4fe878e6aece918908 (diff)
Unify and refactor value printing
Previously, there were two mostly-identical value printers -- one in `libexpr/eval.cc` (which didn't force values) and one in `libcmd/repl.cc` (which did force values and also printed ANSI color codes). This PR unifies both of these printers into `print.cc` and provides a `PrintOptions` struct for controlling the output, which allows for toggling whether values are forced, whether repeated values are tracked, and whether ANSI color codes are displayed. Additionally, `PrintOptions` allows tuning the maximum number of attributes, list items, and bytes in a string that will be displayed; this makes it ideal for contexts where printing too much output (e.g. all of Nixpkgs) is distracting. (As requested by @roberth in https://github.com/NixOS/nix/pull/9554#issuecomment-1845095735) Please read the tests for example output. Future work: - It would be nice to provide this function as a builtin, perhaps `builtins.toStringDebug` -- a printing function that never fails would be useful when debugging Nix code. - It would be nice to support customizing `PrintOptions` members on the command line, e.g. `--option to-string-max-attrs 1000`. (cherry picked from commit 0fa08b451682fb3311fe58112ff05c4fe5bee3a4, ) === Restore ambiguous value printer for `nix-instantiate` The Nix team has requested that this output format remain unchanged. I've added a warning to the man page explaining that `nix-instantiate --eval` output will not parse correctly in many situations. (cherry picked from commit df84dd4d8dd3fd6381ac2ca3064432ab31a16b79) Change-Id: I7cca6b4b53cd0642f2d49af657d5676a8554c9f8
Diffstat (limited to 'doc/manual/src/command-ref')
-rw-r--r--doc/manual/src/command-ref/nix-instantiate.md80
1 files changed, 59 insertions, 21 deletions
diff --git a/doc/manual/src/command-ref/nix-instantiate.md b/doc/manual/src/command-ref/nix-instantiate.md
index e1b4a3e80..483150aa8 100644
--- a/doc/manual/src/command-ref/nix-instantiate.md
+++ b/doc/manual/src/command-ref/nix-instantiate.md
@@ -35,13 +35,50 @@ standard input.
- `--parse`\
Just parse the input files, and print their abstract syntax trees on
- standard output in ATerm format.
+ standard output as a Nix expression.
- `--eval`\
Just parse and evaluate the input files, and print the resulting
values on standard output. No instantiation of store derivations
takes place.
+ > **Warning**
+ >
+ > This option produces ambiguous output which is not suitable for machine
+ > consumption. For example, these two Nix expressions print the same result
+ > despite having different types:
+ >
+ > ```console
+ > $ nix-instantiate --eval --expr '{ a = {}; }'
+ > { a = <CODE>; }
+ > $ nix-instantiate --eval --expr '{ a = <CODE>; }'
+ > { a = <CODE>; }
+ > ```
+ >
+ > For human-readable output, `nix eval` (experimental) is more informative:
+ >
+ > ```console
+ > $ nix-instantiate --eval --expr 'a: a'
+ > <LAMBDA>
+ > $ nix eval --expr 'a: a'
+ > «lambda @ «string»:1:1»
+ > ```
+ >
+ > For machine-readable output, the `--xml` option produces unambiguous
+ > output:
+ >
+ > ```console
+ > $ nix-instantiate --eval --xml --expr '{ foo = <CODE>; }'
+ > <?xml version='1.0' encoding='utf-8'?>
+ > <expr>
+ > <attrs>
+ > <attr column="3" line="1" name="foo">
+ > <unevaluated />
+ > </attr>
+ > </attrs>
+ > </expr>
+ > ```
+
- `--find-file`\
Look up the given files in Nix’s search path (as specified by the
`NIX_PATH` environment variable). If found, print the corresponding
@@ -61,11 +98,11 @@ standard input.
- `--json`\
When used with `--eval`, print the resulting value as an JSON
- representation of the abstract syntax tree rather than as an ATerm.
+ representation of the abstract syntax tree rather than as a Nix expression.
- `--xml`\
When used with `--eval`, print the resulting value as an XML
- representation of the abstract syntax tree rather than as an ATerm.
+ representation of the abstract syntax tree rather than as a Nix expression.
The schema is the same as that used by the [`toXML`
built-in](../language/builtins.md).
@@ -133,28 +170,29 @@ $ nix-instantiate --eval --xml --expr '1 + 2'
The difference between non-strict and strict evaluation:
```console
-$ nix-instantiate --eval --xml --expr 'rec { x = "foo"; y = x; }'
-...
- <attr name="x">
- <string value="foo" />
- </attr>
- <attr name="y">
- <unevaluated />
- </attr>
-...
+$ nix-instantiate --eval --xml --expr '{ x = {}; }'
+<?xml version='1.0' encoding='utf-8'?>
+<expr>
+ <attrs>
+ <attr column="3" line="1" name="x">
+ <unevaluated />
+ </attr>
+ </attrs>
+</expr>
```
Note that `y` is left unevaluated (the XML representation doesn’t
attempt to show non-normal forms).
```console
-$ nix-instantiate --eval --xml --strict --expr 'rec { x = "foo"; y = x; }'
-...
- <attr name="x">
- <string value="foo" />
- </attr>
- <attr name="y">
- <string value="foo" />
- </attr>
-...
+$ nix-instantiate --eval --xml --strict --expr '{ x = {}; }'
+<?xml version='1.0' encoding='utf-8'?>
+<expr>
+ <attrs>
+ <attr column="3" line="1" name="x">
+ <attrs>
+ </attrs>
+ </attr>
+ </attrs>
+</expr>
```