about summary refs log tree commit diff
path: root/tvix/eval/src/value
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2023-06-13T13·15+0200
committerclbot <clbot@tvl.fyi>2023-06-15T11·01+0000
commit0005737f110aa7667aec3ca3bb5bc7d4907a8664 (patch)
tree9c7b46cfb23ea7ae3774ec69db942f63126eeb8e /tvix/eval/src/value
parent9c7d1361c5a049634200c0153d8dcfec6931e89a (diff)
fix(tvix/eval): make tvix display values like nix-instantiate(1) r/6308
In order for the test suite we have currently to be comparable to C++
Nix, we need to display values in the same way. This was largely the
case except in some weird cases.

* <CODE> for thunks and <CYCLE> for repeated thunks (?) are already in
  use. <CODE> formatting is tested by the oracle test suite already.

* Instead of lambda, we need to use <LAMBDA>

* <<primop>> and <<primop-app>> (a formatting C++ Nix uses nowhere)
  now are <PRIMOP> and <PRIMOP-APP>.

We'll probably want to have a fancier display of values (in a separate
trait) down the line. This could be used for interactive usage, e.g. the
REPL or a potential debugger.

There is a peculiarity with C++ Nix 2.3 formatting primops: import is
considered a <<PRIMOP-APP>>, since it is internally implemented by means
of scopedImport. This implementation detail no longer leaks in C++ Nix
2.13 nor in Tvix.

<CYCLE> display is untested at the moment, since we exhibit a
discrepancy to C++ Nix 2.3. Our current detection is more similar to C++
Nix 2.13—luckily it is also the more consistent of the two. See also
b/245.

Change-Id: I1d534434b02e470bf5475b3758920ea81e3420dc
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8760
Reviewed-by: tazjin <tazjin@tvl.su>
Autosubmit: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/value')
-rw-r--r--tvix/eval/src/value/builtin.rs4
-rw-r--r--tvix/eval/src/value/mod.rs3
2 files changed, 4 insertions, 3 deletions
diff --git a/tvix/eval/src/value/builtin.rs b/tvix/eval/src/value/builtin.rs
index 6d08ebf950..b6946d786e 100644
--- a/tvix/eval/src/value/builtin.rs
+++ b/tvix/eval/src/value/builtin.rs
@@ -121,9 +121,9 @@ impl Debug for Builtin {
 impl Display for Builtin {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         if !self.0.partials.is_empty() {
-            f.write_str("<<primop-app>>")
+            f.write_str("<PRIMOP-APP>")
         } else {
-            f.write_str("<<primop>>")
+            f.write_str("<PRIMOP>")
         }
     }
 }
diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs
index 34353df3a7..7e701d52ba 100644
--- a/tvix/eval/src/value/mod.rs
+++ b/tvix/eval/src/value/mod.rs
@@ -758,7 +758,8 @@ impl TotalDisplay for Value {
             Value::Path(p) => p.display().fmt(f),
             Value::Attrs(attrs) => attrs.total_fmt(f, set),
             Value::List(list) => list.total_fmt(f, set),
-            Value::Closure(_) => f.write_str("lambda"), // TODO: print position
+            // TODO: fancy REPL display with position
+            Value::Closure(_) => f.write_str("<LAMBDA>"),
             Value::Builtin(builtin) => builtin.fmt(f),
 
             // Nix prints floats with a maximum precision of 5 digits