git.delta.rocks / jrsonnet / refs/commits / d4bcb6859a73

difftreelog

feat std.{mantissa,exponent} builtins

Yaroslav Bolyukin2021-07-12parent: #f62134d.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth
97 ("acos".into(), builtin_acos),97 ("acos".into(), builtin_acos),
98 ("atan".into(), builtin_atan),98 ("atan".into(), builtin_atan),
99 ("exp".into(), builtin_exp),99 ("exp".into(), builtin_exp),
100 ("mantissa".into(), builtin_mantissa),
101 ("exponent".into(), builtin_exponent),
100 ("extVar".into(), builtin_ext_var),102 ("extVar".into(), builtin_ext_var),
101 ("native".into(), builtin_native),103 ("native".into(), builtin_native),
102 ("filter".into(), builtin_filter),104 ("filter".into(), builtin_filter),
376 })378 })
377}379}
380
381fn frexp(s: f64) -> (f64, i16) {
382 if 0.0 == s {
383 return (s, 0);
384 } else {
385 let lg = s.abs().log2();
386 let x = (lg - lg.floor() - 1.0).exp2();
387 let exp = lg.floor() + 1.0;
388 (s.signum() * x, exp as i16)
389 }
390}
391
392fn builtin_mantissa(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {
393 parse_args!(context, "mantissa", args, 1, [
394 0, x: ty!(number) => Val::Num;
395 ], {
396 Ok(Val::Num(frexp(x).0))
397 })
398}
399
400fn builtin_exponent(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {
401 parse_args!(context, "exponent", args, 1, [
402 0, x: ty!(number) => Val::Num;
403 ], {
404 Ok(Val::Num(frexp(x).1.into()))
405 })
406}
378407
379fn builtin_ext_var(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {408fn builtin_ext_var(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {
380 parse_args!(context, "extVar", args, 1, [409 parse_args!(context, "extVar", args, 1, [
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -35,6 +35,8 @@
   atan:: $intrinsic(atan),
 
   exp:: $intrinsic(exp),
+  mantissa:: $intrinsic(mantissa),
+  exponent:: $intrinsic(exponent),
 
   isString(v):: std.type(v) == 'string',
   isNumber(v):: std.type(v) == 'number',