fix(tvix/eval): thunk string interpolation

If we have multiple string parts, we need to thunk assembling the
string. If we have a single literal, it is strict (like all literals),
but a single interpolation part may compile to a thunk, depending on how
the expression inside is compiled – we can avoid forcing to early here
compared to the previous behavior.

Note that this CL retains the bug that `"${x}"` is erroneously
translated to `x`, implying e.g. `"${12}" == 12`.

The use of `parts.len()` is unproblematic, since normalized_parts()
builds a `Vec` instead of returning an iterator.

Change-Id: I3aecbfefef65cc627b1b8a65be27cbaeada3582b
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6580
Autosubmit: sterni <sternenseemann@systemli.org>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2022-09-14 15:35:28 +02:00
parent b570da18d6
commit bcd7e520f0
3 changed files with 40 additions and 18 deletions

View file

@ -0,0 +1 @@
"strict literal"

View file

@ -0,0 +1,7 @@
let
final = { text = "strict literal"; inherit x y; };
x = "lazy ${throw "interpolation"}";
y = "${throw "also lazy!"}";
in
final.text