From 8425c2016c9a29008cdec8414fc647b8076a7e34 Mon Sep 17 00:00:00 2001 From: James Landrein Date: Mon, 17 Oct 2022 23:37:47 +0200 Subject: feat(tvix/eval): add builtins.{floor,ceil} Change-Id: I4e6c4f96f6f5097a5c637eb3dbbd7bb8b34b7d52 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7032 Autosubmit: j4m3s Tested-by: BuildkiteCI Reviewed-by: tazjin Reviewed-by: grfn --- tvix/eval/src/builtins/mod.rs | 6 ++++++ tvix/eval/src/tests/tvix_tests/eval-okay-ceil.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-ceil.nix | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-floor.exp | 1 + tvix/eval/src/tests/tvix_tests/eval-okay-floor.nix | 1 + tvix/eval/src/value/mod.rs | 1 + tvix/verify-lang-tests/default.nix | 2 ++ 7 files changed, 13 insertions(+) create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-ceil.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-ceil.nix create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-floor.exp create mode 100644 tvix/eval/src/tests/tvix_tests/eval-okay-floor.nix diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 336c320e2f..91fe27aa46 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -134,6 +134,9 @@ fn pure_builtins() -> Vec { Ok(Value::List(NixList::construct(output.len(), output))) }, ), + Builtin::new("ceil", &[true], |args: Vec, _: &mut VM| { + Ok(Value::Integer(args[0].as_float()?.ceil() as i64)) + }), Builtin::new( "compareVersions", &[true, true], @@ -269,6 +272,9 @@ fn pure_builtins() -> Vec { .map(|list| Value::List(NixList::from(list))) .map_err(Into::into) }), + Builtin::new("floor", &[true], |args: Vec, _: &mut VM| { + Ok(Value::Integer(args[0].as_float()?.floor() as i64)) + }), Builtin::new( "foldl'", &[true, false, true], diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-ceil.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-ceil.exp new file mode 100644 index 0000000000..dffbbe59f0 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-ceil.exp @@ -0,0 +1 @@ +[ 4 ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-ceil.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-ceil.nix new file mode 100644 index 0000000000..5835bf829b --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-ceil.nix @@ -0,0 +1 @@ +[ (builtins.ceil 3.4) ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-floor.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-floor.exp new file mode 100644 index 0000000000..6f98a7f48f --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-floor.exp @@ -0,0 +1 @@ +[ 3 ] diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-floor.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-floor.nix new file mode 100644 index 0000000000..c6b79c91a1 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-floor.nix @@ -0,0 +1 @@ +[ (builtins.floor 3.4) ] diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs index 82be292819..355540402d 100644 --- a/tvix/eval/src/value/mod.rs +++ b/tvix/eval/src/value/mod.rs @@ -293,6 +293,7 @@ impl Value { gen_cast!(as_bool, bool, "bool", Value::Bool(b), *b); gen_cast!(as_int, i64, "int", Value::Integer(x), *x); + gen_cast!(as_float, f64, "float", Value::Float(x), *x); gen_cast!(to_str, NixString, "string", Value::String(s), s.clone()); gen_cast!(to_attrs, Rc, "set", Value::Attrs(a), a.clone()); gen_cast!(to_list, NixList, "list", Value::List(l), l.clone()); diff --git a/tvix/verify-lang-tests/default.nix b/tvix/verify-lang-tests/default.nix index 32c9d99b2b..e05ef17a85 100644 --- a/tvix/verify-lang-tests/default.nix +++ b/tvix/verify-lang-tests/default.nix @@ -46,7 +46,9 @@ let # Ordering change after 2.3 "eval-okay-xml.nix" = [ nix ]; # Missing builtins in Nix 2.3 + "eval-okay-ceil.nix" = [ nix ]; "eval-okay-floor-ceil.nix" = [ nix ]; + "eval-okay-floor.nix" = [ nix ]; "eval-okay-groupBy.nix" = [ nix ]; "eval-okay-zipAttrsWith.nix" = [ nix ]; # Comparable lists are not in Nix 2.3 -- cgit 1.4.1