From b42726fa7cecafaab414b63018c3f1ab8eaf8b92 Mon Sep 17 00:00:00 2001 From: He-Pin Date: Wed, 18 Feb 2026 17:01:00 +0800 Subject: [PATCH] chore: Introduce Eval trait. --- readme.md | 40 ++- .../sjsonnet/stdlib/NativeGzip.scala | 4 +- .../src-jvm/sjsonnet/stdlib/NativeXz.scala | 8 +- sjsonnet/src/sjsonnet/Evaluator.scala | 42 +-- sjsonnet/src/sjsonnet/Format.scala | 26 +- sjsonnet/src/sjsonnet/Materializer.scala | 8 +- sjsonnet/src/sjsonnet/Parser.scala | 8 +- sjsonnet/src/sjsonnet/StaticOptimizer.scala | 4 +- sjsonnet/src/sjsonnet/Val.scala | 180 +++++----- sjsonnet/src/sjsonnet/ValScope.scala | 14 +- sjsonnet/src/sjsonnet/ValVisitor.scala | 2 +- .../sjsonnet/functions/FunctionBuilder.scala | 38 +- .../src/sjsonnet/stdlib/ArrayModule.scala | 170 +++++---- .../src/sjsonnet/stdlib/EncodingModule.scala | 6 +- .../src/sjsonnet/stdlib/ManifestModule.scala | 62 ++-- sjsonnet/src/sjsonnet/stdlib/MathModule.scala | 6 +- .../src/sjsonnet/stdlib/NativeRegex.scala | 36 +- .../src/sjsonnet/stdlib/ObjectModule.scala | 66 ++-- sjsonnet/src/sjsonnet/stdlib/SetModule.scala | 57 +-- .../src/sjsonnet/stdlib/StdLibModule.scala | 14 +- .../src/sjsonnet/stdlib/StringModule.scala | 140 ++++---- sjsonnet/src/sjsonnet/stdlib/TypeModule.scala | 50 ++- ...r.function_infinite_default.jsonnet.golden | 338 +++++++++--------- .../test/src-js/sjsonnet/BaseFileTests.scala | 8 +- .../sjsonnet/BaseFileTests.scala | 4 +- .../test/src/sjsonnet/CustomValTests.scala | 4 +- 26 files changed, 674 insertions(+), 661 deletions(-) diff --git a/readme.md b/readme.md index d1923a58..b22b5b50 100644 --- a/readme.md +++ b/readme.md @@ -207,26 +207,46 @@ line which is run by all of these is defined in `MainBenchmark.mainArgs`. You need to change it to point to a suitable input before running a benchmark or the profiler. -## Laziness +## Laziness and Evaluation Model The Jsonnet language is _lazy_: expressions don't get evaluated unless their value is needed, and thus even erroneous expressions do not cause -a failure if un-used. This is represented in the Sjsonnet codebase by -`sjsonnet.Lazy`: a wrapper type that encapsulates an arbitrary -computation that returns a `sjsonnet.Val`. +a failure if un-used. -`sjsonnet.Lazy` is used in several places, representing where -laziness is present in the language: +Sjsonnet models this with a flat type hierarchy rooted at `sjsonnet.Eval`: -- Inside `sjsonnet.Scope`, representing local variable name bindings +``` + Eval (trait) — common interface: def value: Val + / \ +Lazy Val (sealed abstract class) +(final class) | + Val.Str, Val.Num, Val.Arr, Val.Obj, Val.Func, ... +``` + +- **`Eval`** is the unified parent trait defining `def value: Val`. All places + that accept either a lazy or an already-computed value use `Eval` as the type. + +- **`Lazy`** represents lazy evaluation — a computation that has not yet been + performed. It wraps a `() => Val` closure, caches the result on first access, + and is thread-safe. After the value is computed, the closure reference is + cleared to allow it to be garbage collected. + +- **`Val`** represents an already-computed value. It extends `Eval` directly and + implements `value` as simply returning `this`. + +The hierarchy is intentionally kept flat (only two direct implementors of `Eval`) +to enable the JVM JIT compiler's bimorphic inlining optimization on the +hot `Eval.value` call site. + +`Eval` is used in several places, representing where laziness may be +present in the language: + +- Inside `sjsonnet.ValScope`, representing local variable name bindings - Inside `sjsonnet.Val.Arr`, representing the contents of array cells - Inside `sjsonnet.Val.Obj`, representing the contents of object values -`Val` extends `Lazy` so that an already computed value can be treated as -lazy without having to wrap it. - Unlike [google/jsonnet](https://github.com/google/jsonnet), Sjsonnet caches the results of lazy computations the first time they are evaluated, avoiding wasteful re-computation when a value is used more than once. diff --git a/sjsonnet/src-jvm-native/sjsonnet/stdlib/NativeGzip.scala b/sjsonnet/src-jvm-native/sjsonnet/stdlib/NativeGzip.scala index 2a50131e..547625d9 100644 --- a/sjsonnet/src-jvm-native/sjsonnet/stdlib/NativeGzip.scala +++ b/sjsonnet/src-jvm-native/sjsonnet/stdlib/NativeGzip.scala @@ -1,14 +1,14 @@ package sjsonnet.stdlib import sjsonnet.functions.AbstractFunctionModule -import sjsonnet.{Error, EvalScope, Lazy, Platform, Position, Val} +import sjsonnet.{Error, Eval, EvalScope, Platform, Position, Val} object NativeGzip extends AbstractFunctionModule { def name = "gzip" val functions: Seq[(String, Val.Builtin)] = Seq( "gzip" -> new Val.Builtin1("gzip", "v") { - override def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = v.force match { + override def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = v.value match { case Val.Str(_, value) => Val.Str(pos, Platform.gzipString(value)) case arr: Val.Arr => Val.Str(pos, Platform.gzipBytes(arr.iterator.map(_.cast[Val.Num].asInt.toByte).toArray)) diff --git a/sjsonnet/src-jvm/sjsonnet/stdlib/NativeXz.scala b/sjsonnet/src-jvm/sjsonnet/stdlib/NativeXz.scala index dbe758b9..011bc2b5 100644 --- a/sjsonnet/src-jvm/sjsonnet/stdlib/NativeXz.scala +++ b/sjsonnet/src-jvm/sjsonnet/stdlib/NativeXz.scala @@ -1,7 +1,7 @@ package sjsonnet.stdlib import sjsonnet.functions.AbstractFunctionModule -import sjsonnet.{Error, EvalScope, Lazy, Platform, Position, Val} +import sjsonnet.{Error, Eval, EvalScope, Platform, Position, Val} object NativeXz extends AbstractFunctionModule { def name = "xz" @@ -13,8 +13,8 @@ object NativeXz extends AbstractFunctionModule { "compressionLevel", Array(Val.Null(dummyPos), Val.Null(dummyPos)) ) { - override def evalRhs(arg1: Lazy, arg2: Lazy, ev: EvalScope, pos: Position): Val = { - val compressionLevel: Option[Int] = arg2.force match { + override def evalRhs(arg1: Eval, arg2: Eval, ev: EvalScope, pos: Position): Val = { + val compressionLevel: Option[Int] = arg2.value match { case Val.Null(_) => // Use default compression level if the user didn't set one None @@ -23,7 +23,7 @@ object NativeXz extends AbstractFunctionModule { case x => Error.fail("Cannot xz encode with compression level " + x.prettyName) } - arg1.force match { + arg1.value match { case Val.Str(_, value) => Val.Str(pos, Platform.xzString(value, compressionLevel)) case arr: Val.Arr => Val.Str( diff --git a/sjsonnet/src/sjsonnet/Evaluator.scala b/sjsonnet/src/sjsonnet/Evaluator.scala index 15126c4b..971d0afd 100644 --- a/sjsonnet/src/sjsonnet/Evaluator.scala +++ b/sjsonnet/src/sjsonnet/Evaluator.scala @@ -88,14 +88,14 @@ class Evaluator( Error.fail("Should not have happened.", e.pos) } - def visitAsLazy(e: Expr)(implicit scope: ValScope): Lazy = e match { + def visitAsLazy(e: Expr)(implicit scope: ValScope): Eval = e match { case v: Val => v - case e => new LazyWithComputeFunc(() => visitExpr(e)) + case e => new Lazy(() => visitExpr(e)) } def visitValidId(e: ValidId)(implicit scope: ValScope): Val = { val ref = scope.bindings(e.nameIdx) - ref.force + ref.value } def visitSelect(e: Select)(implicit scope: ValScope): Val = visitExpr(e.value) match { @@ -116,7 +116,7 @@ class Evaluator( newScope.bindings(base + i) = b.args match { case null => visitAsLazy(b.rhs)(newScope) case argSpec => - new LazyWithComputeFunc(() => visitMethod(b.rhs, argSpec, b.pos)(newScope)) + new Lazy(() => visitMethod(b.rhs, argSpec, b.pos)(newScope)) } i += 1 } @@ -311,7 +311,7 @@ class Evaluator( } protected def visitApplyBuiltin(e: ApplyBuiltin)(implicit scope: ValScope): Val = { - val arr = new Array[Lazy](e.argExprs.length) + val arr = new Array[Eval](e.argExprs.length) var idx = 0 if (e.tailstrict) { @@ -371,10 +371,10 @@ class Evaluator( if (v.length == 0) Error.fail("array bounds error: array is empty", pos) if (int >= v.length) Error.fail(s"array bounds error: $int not within [0, ${v.length})", pos) - v.force(int) + v.value(int) case (v: Val.Str, i: Val.Num) => val int = i.asPositiveInt - val str = v.value + val str = v.str if (str.isEmpty) Error.fail("string bounds error: string is empty", pos) val unicodeLength = str.codePointCount(0, str.length) if (int >= unicodeLength) @@ -383,7 +383,7 @@ class Evaluator( val endUtf16 = str.offsetByCodePoints(startUtf16, 1) Val.Str(pos, str.substring(startUtf16, endUtf16)) case (v: Val.Obj, i: Val.Str) => - v.value(i.value, pos) + v.value(i.str, pos) case (lhs, rhs) => Error.fail(s"attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) } @@ -393,7 +393,7 @@ class Evaluator( var sup = scope.bindings(e.selfIdx + 1).asInstanceOf[Val.Obj] val key = visitExpr(e.index).cast[Val.Str] if (sup == null) sup = scope.bindings(e.selfIdx).asInstanceOf[Val.Obj] - sup.value(key.value, e.pos) + sup.value(key.str, e.pos) } def visitImportStr(e: ImportStr): Val.Str = @@ -460,7 +460,7 @@ class Evaluator( if (sup == null) Val.False(e.pos) else { val key = visitExpr(e.value).cast[Val.Str] - Val.bool(e.pos, sup.containsKey(key.value)) + Val.bool(e.pos, sup.containsKey(key.str)) } } @@ -642,16 +642,16 @@ class Evaluator( override def evalDefault(expr: Expr, vs: ValScope, es: EvalScope): Val = visitExpr(expr)(vs) } - def visitBindings(bindings: Array[Bind], scope: => ValScope): Array[Lazy] = { - val arrF = new Array[Lazy](bindings.length) + def visitBindings(bindings: Array[Bind], scope: => ValScope): Array[Eval] = { + val arrF = new Array[Eval](bindings.length) var i = 0 while (i < bindings.length) { val b = bindings(i) arrF(i) = b.args match { case null => - new LazyWithComputeFunc(() => visitExpr(b.rhs)(scope)) + new Lazy(() => visitExpr(b.rhs)(scope)) case argSpec => - new LazyWithComputeFunc(() => visitMethod(b.rhs, argSpec, b.pos)(scope)) + new Lazy(() => visitMethod(b.rhs, argSpec, b.pos)(scope)) } i += 1 } @@ -689,7 +689,7 @@ class Evaluator( case null => Error.fail("Assertion failed", a.value.pos, "Assert") case msg => Error.fail( - "Assertion failed: " + visitExpr(msg)(newScope).cast[Val.Str].value, + "Assertion failed: " + visitExpr(msg)(newScope).cast[Val.Str].str, a.value.pos, "Assert" ) @@ -716,7 +716,7 @@ class Evaluator( case null => visitAsLazy(b.rhs)(newScope) case argSpec => - new LazyWithComputeFunc(() => visitMethod(b.rhs, argSpec, b.pos)(newScope)) + new Lazy(() => visitMethod(b.rhs, argSpec, b.pos)(newScope)) } i += 1 j += 1 @@ -851,13 +851,13 @@ class Evaluator( def compare(x: Val, y: Val): Int = (x, y) match { case (_: Val.Null, _: Val.Null) => 0 case (x: Val.Num, y: Val.Num) => x.asDouble.compareTo(y.asDouble) - case (x: Val.Str, y: Val.Str) => Util.compareStringsByCodepoint(x.value, y.value) + case (x: Val.Str, y: Val.Str) => Util.compareStringsByCodepoint(x.str, y.str) case (x: Val.Bool, y: Val.Bool) => x.asBoolean.compareTo(y.asBoolean) case (x: Val.Arr, y: Val.Arr) => val len = math.min(x.length, y.length) var i = 0 while (i < len) { - val cmp = compare(x.force(i), y.force(i)) + val cmp = compare(x.value(i), y.value(i)) if (cmp != 0) return cmp i += 1 } @@ -871,7 +871,7 @@ class Evaluator( case _: Val.Null => y.isInstanceOf[Val.Null] case x: Val.Str => y match { - case y: Val.Str => x.value == y.value + case y: Val.Str => x.str == y.str case _ => false } case x: Val.Num => @@ -886,7 +886,7 @@ class Evaluator( if (xlen != y.length) return false var i = 0 while (i < xlen) { - if (!equal(x.force(i), y.force(i))) return false + if (!equal(x.value(i), y.value(i))) return false i += 1 } true @@ -995,5 +995,5 @@ object Evaluator { */ type Logger = (Boolean, String) => Unit val emptyStringArray = new Array[String](0) - val emptyLazyArray = new Array[Lazy](0) + val emptyLazyArray = new Array[Eval](0) } diff --git a/sjsonnet/src/sjsonnet/Format.scala b/sjsonnet/src/sjsonnet/Format.scala index 46a2f56e..33677c62 100644 --- a/sjsonnet/src/sjsonnet/Format.scala +++ b/sjsonnet/src/sjsonnet/Format.scala @@ -100,7 +100,7 @@ object Format { val values = values0 match { case x: Val.Arr => x case x: Val.Obj => x - case x => Val.Arr(pos, Array[Lazy](x)) + case x => Val.Arr(pos, Array[Eval](x)) } val output = new StringBuilder output.append(leading) @@ -121,9 +121,9 @@ object Format { val raw = formatted.label match { case None => (formatted.widthStar, formatted.precisionStar) match { - case (false, false) => values.cast[Val.Arr].force(i) + case (false, false) => values.cast[Val.Arr].value(i) case (true, false) => - val width = values.cast[Val.Arr].force(i) + val width = values.cast[Val.Arr].value(i) if (!width.isInstanceOf[Val.Num]) { Error.fail( "A * was specified at position %d. An integer is expected for a width".format( @@ -133,9 +133,9 @@ object Format { } i += 1 formatted = formatted.updateWithStarValues(Some(width.asInt), None) - values.cast[Val.Arr].force(i) + values.cast[Val.Arr].value(i) case (false, true) => - val precision = values.cast[Val.Arr].force(i) + val precision = values.cast[Val.Arr].value(i) if (!precision.isInstanceOf[Val.Num]) { Error.fail( "A * was specified at position %d. An integer is expected for a precision" @@ -144,9 +144,9 @@ object Format { } i += 1 formatted = formatted.updateWithStarValues(None, Some(precision.asInt)) - values.cast[Val.Arr].force(i) + values.cast[Val.Arr].value(i) case (true, true) => - val width = values.cast[Val.Arr].force(i) + val width = values.cast[Val.Arr].value(i) if (!width.isInstanceOf[Val.Num]) { Error.fail( "A * was specified at position %d. An integer is expected for a width".format( @@ -155,7 +155,7 @@ object Format { ) } i += 1 - val precision = values.cast[Val.Arr].force(i) + val precision = values.cast[Val.Arr].value(i) if (!precision.isInstanceOf[Val.Num]) { Error.fail( "A * was specified at position %d. An integer is expected for a precision" @@ -165,16 +165,16 @@ object Format { i += 1 formatted = formatted.updateWithStarValues(Some(width.asInt), Some(precision.asInt)) - values.cast[Val.Arr].force(i) + values.cast[Val.Arr].value(i) } case Some(key) => values match { - case v: Val.Arr => v.force(i) + case v: Val.Arr => v.value(i) case v: Val.Obj => v.value(key, pos) case _ => Error.fail("Invalid format values") } } - val value = raw.force match { + val value = raw.value match { case f: Val.Func => Error.fail("Cannot format function value", f) case r: Val.Arr => Materializer.apply0(r, new Renderer(indent = -1)) case r: Val.Obj => Materializer.apply0(r, new Renderer(indent = -1)) @@ -380,7 +380,7 @@ object Format { class PartialApplyFmt(fmt: String) extends Val.Builtin1("format", "values") { val (leading, chunks) = fastparse.parse(fmt, format(_)).get.value - def evalRhs(values0: Lazy, ev: EvalScope, pos: Position): Val = - Val.Str(pos, format(leading, chunks, values0.force, pos)(ev)) + def evalRhs(values0: Eval, ev: EvalScope, pos: Position): Val = + Val.Str(pos, format(leading, chunks, values0.value, pos)(ev)) } } diff --git a/sjsonnet/src/sjsonnet/Materializer.scala b/sjsonnet/src/sjsonnet/Materializer.scala index 5e4b2633..0661d997 100644 --- a/sjsonnet/src/sjsonnet/Materializer.scala +++ b/sjsonnet/src/sjsonnet/Materializer.scala @@ -50,7 +50,7 @@ abstract class Materializer { var i = 0 while (i < xs.length) { val sub = arrVisitor.subVisitor.asInstanceOf[Visitor[T, T]] - arrVisitor.visitValue(apply0(xs.force(i), sub), -1) + arrVisitor.visitValue(apply0(xs.value(i), sub), -1) i += 1 } arrVisitor.visitEnd(-1) @@ -83,11 +83,11 @@ abstract class Materializer { case ujson.Str(s) => Val.Str(pos, s) case ujson.Arr(xs) => val len = xs.length - val res = new Array[Lazy](len) + val res = new Array[Eval](len) var i = 0 while (i < len) { val x = xs(i) - res(i) = new LazyWithComputeFunc(() => reverse(pos, x)) + res(i) = new Lazy(() => reverse(pos, x)) i += 1 } Val.Arr(pos, res) @@ -147,7 +147,7 @@ object Materializer extends Materializer { def storePos(v: Val): Unit = () final val emptyStringArray = new Array[String](0) - final val emptyLazyArray = new Array[Lazy](0) + final val emptyLazyArray = new Array[Eval](0) /** * Trait for providing custom materialization logic to the Materializer. diff --git a/sjsonnet/src/sjsonnet/Parser.scala b/sjsonnet/src/sjsonnet/Parser.scala index 3ddfdd85..4b65b829 100644 --- a/sjsonnet/src/sjsonnet/Parser.scala +++ b/sjsonnet/src/sjsonnet/Parser.scala @@ -66,7 +66,7 @@ object Parser { def idStartChar(c: Char): Boolean = c == '_' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') - private val emptyLazyArray = new Array[Lazy](0) + private val emptyLazyArray = new Array[Eval](0) private val isSpaceOrTab: Char => Boolean = c => c == ' ' || c == '\t' } @@ -409,7 +409,7 @@ class Parser( case (first, None) => Expr.Arr(offset, Array(first)) case (first, Some(Left(comp))) => Expr.Comp(offset, first, comp._1, comp._2.toArray) case (first: Val, Some(Right(rest))) if rest.forall(_.isInstanceOf[Val]) => - val a = new Array[Lazy](rest.length + 1) + val a = new Array[Eval](rest.length + 1) a(0) = first var i = 1 rest.foreach { v => @@ -756,9 +756,9 @@ class Parser( (lhs, comps) match { case (Val.Str(_, _), (Expr.ForSpec(_, _, Expr.Arr(_, values)), _)) if values.length > 1 => - Fail.opaque(s"""no duplicate field: "${lhs.asInstanceOf[Val.Str].value}" """) + Fail.opaque(s"""no duplicate field: "${lhs.asInstanceOf[Val.Str].str}" """) case (Val.Str(_, _), (Expr.ForSpec(_, _, arr: Val.Arr), _)) if arr.length > 1 => - Fail.opaque(s"""no duplicate field: "${lhs.asInstanceOf[Val.Str].value}" """) + Fail.opaque(s"""no duplicate field: "${lhs.asInstanceOf[Val.Str].str}" """) case _ => Pass( Expr.ObjBody.ObjComp( diff --git a/sjsonnet/src/sjsonnet/StaticOptimizer.scala b/sjsonnet/src/sjsonnet/StaticOptimizer.scala index 228b3131..25de8a47 100644 --- a/sjsonnet/src/sjsonnet/StaticOptimizer.scala +++ b/sjsonnet/src/sjsonnet/StaticOptimizer.scala @@ -41,7 +41,7 @@ class StaticOptimizer( case BinaryOp(pos, lhs, BinaryOp.OP_in, ValidSuper(_, selfIdx)) => InSuper(pos, lhs, selfIdx) case b2 @ BinaryOp(pos, lhs: Val.Str, BinaryOp.OP_%, rhs) => - try ApplyBuiltin1(pos, new Format.PartialApplyFmt(lhs.value), rhs, tailstrict = false) + try ApplyBuiltin1(pos, new Format.PartialApplyFmt(lhs.str), rhs, tailstrict = false) catch { case _: Exception => b2 } case e @ Id(pos, name) => @@ -132,7 +132,7 @@ class StaticOptimizer( transform(x) match { case x2: Val.Str => // println(s"----- Fixing FieldName: "+x2.value) - FieldName.Fixed(x2.value) + FieldName.Fixed(x2.str) case x2 if x2 eq x => f case x2 => FieldName.Dyn(x2) } diff --git a/sjsonnet/src/sjsonnet/Val.scala b/sjsonnet/src/sjsonnet/Val.scala index d6f77ec5..7ea602d2 100644 --- a/sjsonnet/src/sjsonnet/Val.scala +++ b/sjsonnet/src/sjsonnet/Val.scala @@ -10,21 +10,21 @@ import scala.collection.mutable.ArrayBuffer import scala.reflect.ClassTag /** - * [[Lazy]] models lazy evaluation within a Jsonnet program. Lazily evaluated dictionary values, - * array contents, or function parameters are all wrapped in [[Lazy]] and only truly evaluated - * on-demand. [[Val]] also extends [[Lazy]] so that already-evaluated values can be stored directly - * in [[Array[Lazy]]] without wrapper overhead. + * [[Eval]] is the common parent trait for both lazy and eager evaluation, providing a unified + * abstraction for evaluation strategies within a Jsonnet program. */ -trait Lazy { - def force: Val +trait Eval { + def value: Val } /** - * Thread-safe implementation that discards the compute function after initialization. + * Thread-safe lazy evaluation implementation that discards the compute function after + * initialization. Lazily evaluated dictionary values, array contents, or function parameters are + * all wrapped in [[Lazy]] and only truly evaluated on-demand. */ -final class LazyWithComputeFunc(@volatile private var computeFunc: () => Val) extends Lazy { +final class Lazy(@volatile private var computeFunc: () => Val) extends Eval { private var cached: Val = _ - def force: Val = { + def value: Val = { if (cached != null) return cached val f = computeFunc if (f != null) { // we won the race to initialize @@ -44,8 +44,8 @@ final class LazyWithComputeFunc(@volatile private var computeFunc: () => Val) ex * [[Val]] data structure is essentially a JSON tree, except evaluation of object attributes and * array contents are lazy, and the tree can contain functions. */ -sealed abstract class Val extends Lazy { - final def force: Val = this +sealed abstract class Val extends Eval { + final def value: Val = this def pos: Position def prettyName: String @@ -101,74 +101,74 @@ object Val { final case class Null(pos: Position) extends Literal { def prettyName = "null" } - final case class Str(pos: Position, value: String) extends Literal { + final case class Str(pos: Position, str: String) extends Literal { def prettyName = "string" - override def asString: String = value + override def asString: String = str } - final case class Num(pos: Position, private val value: Double) extends Literal { - if (value.isInfinite) { + final case class Num(pos: Position, private val num: Double) extends Literal { + if (num.isInfinite) { Error.fail("overflow") } def prettyName = "number" - override def asInt: Int = value.toInt + override def asInt: Int = num.toInt def asPositiveInt: Int = { - if (!value.isWhole || !value.isValidInt) { + if (!num.isWhole || !num.isValidInt) { Error.fail("index value is not a valid integer") } - if (value.toInt < 0) { - Error.fail("index value is not a positive integer, got: " + value.toInt) + if (num.toInt < 0) { + Error.fail("index value is not a positive integer, got: " + num.toInt) } - value.toInt + num.toInt } - override def asLong: Long = value.toLong + override def asLong: Long = num.toLong def asSafeLong: Long = { - if (value.isInfinite || value.isNaN) { + if (num.isInfinite || num.isNaN) { Error.fail("numeric value is not finite") } - if (value < DOUBLE_MIN_SAFE_INTEGER || value > DOUBLE_MAX_SAFE_INTEGER) { + if (num < DOUBLE_MIN_SAFE_INTEGER || num > DOUBLE_MAX_SAFE_INTEGER) { Error.fail("numeric value outside safe integer range for bitwise operation") } - value.toLong + num.toLong } override def asDouble: Double = { - if (value.isNaN) { + if (num.isNaN) { Error.fail("not a number") } - value + num } } - final case class Arr(pos: Position, private val value: Array[? <: Lazy]) extends Literal { + final case class Arr(pos: Position, private val arr: Array[? <: Eval]) extends Literal { def prettyName = "array" override def asArr: Arr = this - def length: Int = value.length - def force(i: Int): Val = value(i).force + def length: Int = arr.length + def value(i: Int): Val = arr(i).value - def asLazyArray: Array[Lazy] = value.asInstanceOf[Array[Lazy]] - def asStrictArray: Array[Val] = value.map(_.force) + def asLazyArray: Array[Eval] = arr.asInstanceOf[Array[Eval]] + def asStrictArray: Array[Val] = arr.map(_.value) - def concat(newPos: Position, rhs: Arr): Arr = Arr(newPos, value ++ rhs.value) + def concat(newPos: Position, rhs: Arr): Arr = Arr(newPos, arr ++ rhs.arr) - def iterator: Iterator[Val] = value.iterator.map(_.force) + def iterator: Iterator[Val] = arr.iterator.map(_.value) def foreach[U](f: Val => U): Unit = { var i = 0 - while (i < value.length) { - f(value(i).force) + while (i < arr.length) { + f(arr(i).value) i += 1 } } def forall(f: Val => Boolean): Boolean = { var i = 0 - while (i < value.length) { - if (!f(value(i).force)) return false + while (i < arr.length) { + if (!f(arr(i).value)) return false i += 1 } true @@ -545,11 +545,11 @@ object Val { private def mergeMember(l: Val, r: Val, pos: Position)(implicit evaluator: EvalScope): Literal = (l, r) match { case (lStr: Val.Str, rStr: Val.Str) => - Val.Str(pos, lStr.value ++ rStr.value) + Val.Str(pos, lStr.str ++ rStr.str) case (lStr: Val.Str, _) => - Val.Str(pos, lStr.value ++ renderString(r)) + Val.Str(pos, lStr.str ++ renderString(r)) case (_, rStr: Val.Str) => - Val.Str(pos, renderString(l) ++ rStr.value) + Val.Str(pos, renderString(l) ++ rStr.str) case (lNum: Val.Num, rNum: Val.Num) => Val.Num(pos, lNum.asDouble + rNum.asDouble) case (lArr: Val.Arr, rArr: Val.Arr) => @@ -672,7 +672,7 @@ object Val { override def asFunc: Func = this - def apply(argsL: Array[? <: Lazy], namedNames: Array[String], outerPos: Position)(implicit + def apply(argsL: Array[? <: Eval], namedNames: Array[String], outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = { val simple = namedNames == null && params.names.length == argsL.length @@ -683,7 +683,7 @@ object Val { // println(s"apply: argsL: ${argsL.length}, namedNames: $namedNames, paramNames: ${params.names.mkString(",")}") if (simple) { if (tailstrictMode == TailstrictModeEnabled) { - argsL.foreach(_.force) + argsL.foreach(_.value) } val newScope = defSiteValScope.extendSimple(argsL) evalRhs(newScope, ev, funDefFileScope, outerPos) @@ -723,7 +723,7 @@ object Val { if (argVals(j) == null) { val default = params.defaultExprs(i) if (default != null) { - argVals(j) = new LazyWithComputeFunc(() => evalDefault(default, newScope, ev)) + argVals(j) = new Lazy(() => evalDefault(default, newScope, ev)) } else { if (missing == null) missing = new ArrayBuffer missing.+=(params.names(i)) @@ -741,7 +741,7 @@ object Val { } } if (tailstrictMode == TailstrictModeEnabled) { - argVals.foreach(_.force) + argVals.foreach(_.value) } evalRhs(newScope, ev, funDefFileScope, outerPos) } @@ -758,7 +758,7 @@ object Val { } } - def apply1(argVal: Lazy, outerPos: Position)(implicit + def apply1(argVal: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = { if (params.names.length != 1) apply(Array(argVal), null, outerPos) @@ -768,14 +768,14 @@ object Val { case p => p.fileScope } if (tailstrictMode == TailstrictModeEnabled) { - argVal.force + argVal.value } val newScope: ValScope = defSiteValScope.extendSimple(argVal) evalRhs(newScope, ev, funDefFileScope, outerPos) } } - def apply2(argVal1: Lazy, argVal2: Lazy, outerPos: Position)(implicit + def apply2(argVal1: Eval, argVal2: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = { if (params.names.length != 2) apply(Array(argVal1, argVal2), null, outerPos) @@ -785,15 +785,15 @@ object Val { case p => p.fileScope } if (tailstrictMode == TailstrictModeEnabled) { - argVal1.force - argVal2.force + argVal1.value + argVal2.value } val newScope: ValScope = defSiteValScope.extendSimple(argVal1, argVal2) evalRhs(newScope, ev, funDefFileScope, outerPos) } } - def apply3(argVal1: Lazy, argVal2: Lazy, argVal3: Lazy, outerPos: Position)(implicit + def apply3(argVal1: Eval, argVal2: Eval, argVal3: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = { if (params.names.length != 3) apply(Array(argVal1, argVal2, argVal3), null, outerPos) @@ -803,9 +803,9 @@ object Val { case p => p.fileScope } if (tailstrictMode == TailstrictModeEnabled) { - argVal1.force - argVal2.force - argVal3.force + argVal1.value + argVal2.value + argVal3.value } val newScope: ValScope = defSiteValScope.extendSimple(argVal1, argVal2, argVal3) evalRhs(newScope, ev, funDefFileScope, outerPos) @@ -835,40 +835,40 @@ object Val { evalRhs(scope.bindings, ev, pos) } - def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val + def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val - override def apply1(argVal: Lazy, outerPos: Position)(implicit + override def apply1(argVal: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = if (params.names.length != 1) apply(Array(argVal), null, outerPos) else { if (tailstrictMode == TailstrictModeEnabled) { - argVal.force + argVal.value } evalRhs(Array(argVal), ev, outerPos) } - override def apply2(argVal1: Lazy, argVal2: Lazy, outerPos: Position)(implicit + override def apply2(argVal1: Eval, argVal2: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = if (params.names.length != 2) apply(Array(argVal1, argVal2), null, outerPos) else { if (tailstrictMode == TailstrictModeEnabled) { - argVal1.force - argVal2.force + argVal1.value + argVal2.value } evalRhs(Array(argVal1, argVal2), ev, outerPos) } - override def apply3(argVal1: Lazy, argVal2: Lazy, argVal3: Lazy, outerPos: Position)(implicit + override def apply3(argVal1: Eval, argVal2: Eval, argVal3: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = if (params.names.length != 3) apply(Array(argVal1, argVal2, argVal3), null, outerPos) else { if (tailstrictMode == TailstrictModeEnabled) { - argVal1.force - argVal2.force - argVal3.force + argVal1.value + argVal2.value + argVal3.value } evalRhs(Array(argVal1, argVal2, argVal3), ev, outerPos) } @@ -889,12 +889,12 @@ object Val { abstract class Builtin0(fn: String, def1: Expr = null) extends Builtin(fn: String, Array.empty, if (def1 == null) null else Array(def1)) { - final def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = + final def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = evalRhs(ev, pos) def evalRhs(ev: EvalScope, pos: Position): Val - override def apply(argVals: Array[? <: Lazy], namedNames: Array[String], outerPos: Position)( + override def apply(argVals: Array[? <: Eval], namedNames: Array[String], outerPos: Position)( implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = @@ -905,38 +905,38 @@ object Val { abstract class Builtin1(fn: String, pn1: String, def1: Expr = null) extends Builtin(fn: String, Array(pn1), if (def1 == null) null else Array(def1)) { - final def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = - evalRhs(args(0).force, ev, pos) + final def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = + evalRhs(args(0).value, ev, pos) - def evalRhs(arg1: Lazy, ev: EvalScope, pos: Position): Val + def evalRhs(arg1: Eval, ev: EvalScope, pos: Position): Val - override def apply(argVals: Array[? <: Lazy], namedNames: Array[String], outerPos: Position)( + override def apply(argVals: Array[? <: Eval], namedNames: Array[String], outerPos: Position)( implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = - if (namedNames == null && argVals.length == 1) evalRhs(argVals(0).force, ev, outerPos) + if (namedNames == null && argVals.length == 1) evalRhs(argVals(0).value, ev, outerPos) else super.apply(argVals, namedNames, outerPos) } abstract class Builtin2(fn: String, pn1: String, pn2: String, defs: Array[Expr] = null) extends Builtin(fn: String, Array(pn1, pn2), defs) { - final def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = - evalRhs(args(0).force, args(1).force, ev, pos) + final def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = + evalRhs(args(0).value, args(1).value, ev, pos) - def evalRhs(arg1: Lazy, arg2: Lazy, ev: EvalScope, pos: Position): Val + def evalRhs(arg1: Eval, arg2: Eval, ev: EvalScope, pos: Position): Val - override def apply(argVals: Array[? <: Lazy], namedNames: Array[String], outerPos: Position)( + override def apply(argVals: Array[? <: Eval], namedNames: Array[String], outerPos: Position)( implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = if (namedNames == null && argVals.length == 2) - evalRhs(argVals(0).force, argVals(1).force, ev, outerPos) + evalRhs(argVals(0).value, argVals(1).value, ev, outerPos) else super.apply(argVals, namedNames, outerPos) - override def apply2(argVal1: Lazy, argVal2: Lazy, outerPos: Position)(implicit + override def apply2(argVal1: Eval, argVal2: Eval, outerPos: Position)(implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = - if (params.names.length == 2) evalRhs(argVal1.force, argVal2.force, ev, outerPos) + if (params.names.length == 2) evalRhs(argVal1.value, argVal2.value, ev, outerPos) else super.apply(Array(argVal1, argVal2), null, outerPos) } @@ -947,17 +947,17 @@ object Val { pn3: String, defs: Array[Expr] = null) extends Builtin(fn: String, Array(pn1, pn2, pn3), defs) { - final def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = - evalRhs(args(0).force, args(1).force, args(2).force, ev, pos) + final def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = + evalRhs(args(0).value, args(1).value, args(2).value, ev, pos) - def evalRhs(arg1: Lazy, arg2: Lazy, arg3: Lazy, ev: EvalScope, pos: Position): Val + def evalRhs(arg1: Eval, arg2: Eval, arg3: Eval, ev: EvalScope, pos: Position): Val - override def apply(argVals: Array[? <: Lazy], namedNames: Array[String], outerPos: Position)( + override def apply(argVals: Array[? <: Eval], namedNames: Array[String], outerPos: Position)( implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = if (namedNames == null && argVals.length == 3) - evalRhs(argVals(0).force, argVals(1).force, argVals(2).force, ev, outerPos) + evalRhs(argVals(0).value, argVals(1).value, argVals(2).value, ev, outerPos) else super.apply(argVals, namedNames, outerPos) } @@ -969,21 +969,21 @@ object Val { pn4: String, defs: Array[Expr] = null) extends Builtin(fn: String, Array(pn1, pn2, pn3, pn4), defs) { - final def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = - evalRhs(args(0).force, args(1).force, args(2).force, args(3).force, ev, pos) + final def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = + evalRhs(args(0).value, args(1).value, args(2).value, args(3).value, ev, pos) - def evalRhs(arg1: Lazy, arg2: Lazy, arg3: Lazy, arg4: Lazy, ev: EvalScope, pos: Position): Val + def evalRhs(arg1: Eval, arg2: Eval, arg3: Eval, arg4: Eval, ev: EvalScope, pos: Position): Val - override def apply(argVals: Array[? <: Lazy], namedNames: Array[String], outerPos: Position)( + override def apply(argVals: Array[? <: Eval], namedNames: Array[String], outerPos: Position)( implicit ev: EvalScope, tailstrictMode: TailstrictMode): Val = if (namedNames == null && argVals.length == 4) evalRhs( - argVals(0).force, - argVals(1).force, - argVals(2).force, - argVals(3).force, + argVals(0).value, + argVals(1).value, + argVals(2).value, + argVals(3).value, ev, outerPos ) diff --git a/sjsonnet/src/sjsonnet/ValScope.scala b/sjsonnet/src/sjsonnet/ValScope.scala index 3cddf80f..3d3193b8 100644 --- a/sjsonnet/src/sjsonnet/ValScope.scala +++ b/sjsonnet/src/sjsonnet/ValScope.scala @@ -14,11 +14,11 @@ import java.util * The bindings array is private and only copy-on-write, so for nested scopes which do not change it * (e.g. those just updating `dollar0` or `self0`) the bindings array can be shared cheaply. */ -final class ValScope private (val bindings: Array[Lazy]) extends AnyVal { +final class ValScope private (val bindings: Array[Eval]) extends AnyVal { def length: Int = bindings.length - def extend(newBindings: Array[Lazy], newSelf: Val.Obj, newSuper: Val.Obj): ValScope = { + def extend(newBindings: Array[Eval], newSelf: Val.Obj, newSuper: Val.Obj): ValScope = { val b = util.Arrays.copyOf(bindings, bindings.length + newBindings.length + 2) b(bindings.length) = newSelf b(bindings.length + 1) = newSuper @@ -26,7 +26,7 @@ final class ValScope private (val bindings: Array[Lazy]) extends AnyVal { new ValScope(b) } - def extendSimple(newBindingsV: Array[? <: Lazy]): ValScope = { + def extendSimple(newBindingsV: Array[? <: Eval]): ValScope = { if (newBindingsV == null || newBindingsV.length == 0) this else { val b = util.Arrays.copyOf(bindings, bindings.length + newBindingsV.length) @@ -39,20 +39,20 @@ final class ValScope private (val bindings: Array[Lazy]) extends AnyVal { if (num == 0) this else new ValScope(util.Arrays.copyOf(bindings, bindings.length + num)) - def extendSimple(l1: Lazy): ValScope = { + def extendSimple(l1: Eval): ValScope = { val b = util.Arrays.copyOf(bindings, bindings.length + 1) b(bindings.length) = l1 new ValScope(b) } - def extendSimple(l1: Lazy, l2: Lazy): ValScope = { + def extendSimple(l1: Eval, l2: Eval): ValScope = { val b = util.Arrays.copyOf(bindings, bindings.length + 2) b(bindings.length) = l1 b(bindings.length + 1) = l2 new ValScope(b) } - def extendSimple(l1: Lazy, l2: Lazy, l3: Lazy): ValScope = { + def extendSimple(l1: Eval, l2: Eval, l3: Eval): ValScope = { val b = util.Arrays.copyOf(bindings, bindings.length + 3) b(bindings.length) = l1 b(bindings.length + 1) = l2 @@ -62,6 +62,6 @@ final class ValScope private (val bindings: Array[Lazy]) extends AnyVal { } object ValScope { - private val emptyArr = new Array[Lazy](0) + private val emptyArr = new Array[Eval](0) def empty = new ValScope(emptyArr) } diff --git a/sjsonnet/src/sjsonnet/ValVisitor.scala b/sjsonnet/src/sjsonnet/ValVisitor.scala index f19b37f7..96b31a08 100644 --- a/sjsonnet/src/sjsonnet/ValVisitor.scala +++ b/sjsonnet/src/sjsonnet/ValVisitor.scala @@ -14,7 +14,7 @@ class ValVisitor(pos: Position) extends JsVisitor[Val, Val] { self => visitObject(length, index) def visitArray(length: Int, index: Int): ArrVisitor[Val, Val] = new ArrVisitor[Val, Val] { - val a = new mutable.ArrayBuilder.ofRef[Lazy] + val a = new mutable.ArrayBuilder.ofRef[Eval] if (length >= 0) a.sizeHint(length) def subVisitor: Visitor[?, ?] = self def visitValue(v: Val, index: Int): Unit = a.+=(v) diff --git a/sjsonnet/src/sjsonnet/functions/FunctionBuilder.scala b/sjsonnet/src/sjsonnet/functions/FunctionBuilder.scala index 6dc581bc..c4919a92 100644 --- a/sjsonnet/src/sjsonnet/functions/FunctionBuilder.scala +++ b/sjsonnet/src/sjsonnet/functions/FunctionBuilder.scala @@ -26,9 +26,9 @@ trait FunctionBuilder { ( name, new Val.Builtin1(name, p1) { - def evalRhs(arg1: Lazy, ev: EvalScope, outerPos: Position): Val = { + def evalRhs(arg1: Eval, ev: EvalScope, outerPos: Position): Val = { // println("--- calling builtin: "+name) - val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force) + val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.value) implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1)) } } @@ -40,10 +40,10 @@ trait FunctionBuilder { ( name, new Val.Builtin2(name, p1, p2) { - def evalRhs(arg1: Lazy, arg2: Lazy, ev: EvalScope, outerPos: Position): Val = { + def evalRhs(arg1: Eval, arg2: Eval, ev: EvalScope, outerPos: Position): Val = { // println("--- calling builtin: "+name) - val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force) - val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.force) + val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.value) + val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.value) implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1, v2)) } } @@ -58,11 +58,11 @@ trait FunctionBuilder { ( name, new Val.Builtin3(name, p1, p2, p3) { - def evalRhs(arg1: Lazy, arg2: Lazy, arg3: Lazy, ev: EvalScope, outerPos: Position): Val = { + def evalRhs(arg1: Eval, arg2: Eval, arg3: Eval, ev: EvalScope, outerPos: Position): Val = { // println("--- calling builtin: "+name) - val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force) - val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.force) - val v3: T3 = implicitly[ReadWriter[T3]].apply(arg3.force) + val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.value) + val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.value) + val v3: T3 = implicitly[ReadWriter[T3]].apply(arg3.value) implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1, v2, v3)) } } @@ -79,17 +79,17 @@ trait FunctionBuilder { name, new Val.Builtin4(name, p1, p2, p3, p4) { def evalRhs( - arg1: Lazy, - arg2: Lazy, - arg3: Lazy, - arg4: Lazy, + arg1: Eval, + arg2: Eval, + arg3: Eval, + arg4: Eval, ev: EvalScope, outerPos: Position): Val = { // println("--- calling builtin: "+name) - val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.force) - val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.force) - val v3: T3 = implicitly[ReadWriter[T3]].apply(arg3.force) - val v4: T4 = implicitly[ReadWriter[T4]].apply(arg4.force) + val v1: T1 = implicitly[ReadWriter[T1]].apply(arg1.value) + val v2: T2 = implicitly[ReadWriter[T2]].apply(arg2.value) + val v3: T3 = implicitly[ReadWriter[T3]].apply(arg3.value) + val v4: T4 = implicitly[ReadWriter[T4]].apply(arg4.value) implicitly[ReadWriter[R]].write(outerPos, eval(outerPos, ev, v1, v2, v3, v4)) } } @@ -104,8 +104,8 @@ trait FunctionBuilder { def builtinWithDefaults[R: ReadWriter](name: String, params: (String, Val.Literal)*)( eval: (Array[Val], Position, EvalScope) => R): (String, Val.Func) = { name -> new Val.Builtin(name, params.map(_._1).toArray, params.map(_._2).toArray) { - def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = - implicitly[ReadWriter[R]].write(pos, eval(args.map(_.force), pos, ev)) + def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = + implicitly[ReadWriter[R]].write(pos, eval(args.map(_.value), pos, ev)) } } } diff --git a/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala b/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala index 300c7ca1..0707393b 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala @@ -14,15 +14,15 @@ object ArrayModule extends AbstractFunctionModule { Array("arr", "keyF", "onEmpty"), Array(null, Val.False(dummyPos), Val.False(dummyPos)) ) { - override def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = { - val arr = args(0).force.asArr - val keyF = args(1).force + override def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = { + val arr = args(0).value.asArr + val keyF = args(1).value val onEmpty = args(2) if (arr.length == 0) { - if (onEmpty.force.isInstanceOf[Val.False]) { + if (onEmpty.value.isInstanceOf[Val.False]) { Error.fail("Expected at least one element in array. Got none") } else { - onEmpty.force + onEmpty.value } } else if (keyF.isInstanceOf[Val.False]) { arr.asStrictArray.min(ev) @@ -35,7 +35,7 @@ object ArrayModule extends AbstractFunctionModule { ) .zipWithIndex .min((x: (Val, Int), y: (Val, Int)) => ev.compare(x._1, y._1)) - arr.force(minTuple._2) + arr.value(minTuple._2) } } } @@ -46,15 +46,15 @@ object ArrayModule extends AbstractFunctionModule { Array("arr", "keyF", "onEmpty"), Array(null, Val.False(dummyPos), Val.False(dummyPos)) ) { - override def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = { - val arr = args(0).force.asArr - val keyF = args(1).force + override def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = { + val arr = args(0).value.asArr + val keyF = args(1).value val onEmpty = args(2) if (arr.length == 0) { - if (onEmpty.force.isInstanceOf[Val.False]) { + if (onEmpty.value.isInstanceOf[Val.False]) { Error.fail("Expected at least one element in array. Got none") } else { - onEmpty.force + onEmpty.value } } else if (keyF.isInstanceOf[Val.False]) { arr.asStrictArray.max(ev) @@ -67,41 +67,41 @@ object ArrayModule extends AbstractFunctionModule { ) .zipWithIndex .max((x: (Val, Int), y: (Val, Int)) => ev.compare(x._1, y._1)) - arr.force(maxTuple._2) + arr.value(maxTuple._2) } } } private object All extends Val.Builtin1("all", "arr") { - def evalRhs(arr: Lazy, ev: EvalScope, pos: Position): Val = { - Val.bool(pos, arr.force.asArr.forall(v => v.asBoolean)) + def evalRhs(arr: Eval, ev: EvalScope, pos: Position): Val = { + Val.bool(pos, arr.value.asArr.forall(v => v.asBoolean)) } } private object Any extends Val.Builtin1("any", "arr") { - def evalRhs(arr: Lazy, ev: EvalScope, pos: Position): Val = { - Val.bool(pos, arr.force.asArr.iterator.exists(v => v.asBoolean)) + def evalRhs(arr: Eval, ev: EvalScope, pos: Position): Val = { + Val.bool(pos, arr.value.asArr.iterator.exists(v => v.asBoolean)) } } private object Count extends Val.Builtin2("count", "arr", "x") { - def evalRhs(arr: Lazy, x: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(arr: Eval, x: Eval, ev: EvalScope, pos: Position): Val = { var count = 0 - arr.force.asArr.foreach(v => if (ev.equal(v.force, x.force)) count += 1) + arr.value.asArr.foreach(v => if (ev.equal(v.value, x.value)) count += 1) Val.Num(pos, count) } } private object Filter extends Val.Builtin2("filter", "func", "arr") { - def evalRhs(_func: Lazy, arr: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(_func: Eval, arr: Eval, ev: EvalScope, pos: Position): Val = { val p = pos.noOffset - val a = arr.force.asArr.asLazyArray + val a = arr.value.asArr.asLazyArray var i = 0 - val func = _func.force.asFunc + val func = _func.value.asFunc if (func.isInstanceOf[Val.Builtin] || func.params.names.length != 1) { while (i < a.length) { if (!func.apply1(a(i), p)(ev, TailstrictModeDisabled).asBoolean) { - var b = new Array[Lazy](a.length - 1) + var b = new Array[Eval](a.length - 1) System.arraycopy(a, 0, b, 0, i) var j = i + 1 while (j < a.length) { @@ -128,7 +128,7 @@ object ArrayModule extends AbstractFunctionModule { while (i < a.length) { newScope.bindings(scopeIdx) = a(i) if (!func.evalRhs(newScope, ev, funDefFileScope, p).asBoolean) { - var b = new Array[Lazy](a.length - 1) + var b = new Array[Eval](a.length - 1) System.arraycopy(a, 0, b, 0, i) var j = i + 1 while (j < a.length) { @@ -150,9 +150,9 @@ object ArrayModule extends AbstractFunctionModule { } private object Map_ extends Val.Builtin2("map", "func", "arr") { - def evalRhs(_func: Lazy, arr: Lazy, ev: EvalScope, pos: Position): Val = { - val func = _func.force.asFunc - val arg = arr.force + def evalRhs(_func: Eval, arr: Eval, ev: EvalScope, pos: Position): Val = { + val func = _func.value.asFunc + val arg = arr.value arg match { case Val.Str(_, str) => evalStr(func, str, ev, pos.noOffset) case _ => evalArr(func, arg.asArr.asLazyArray, ev, pos) @@ -161,14 +161,12 @@ object ArrayModule extends AbstractFunctionModule { private def evalArr( _func: Val.Func, - arg: Array[Lazy], + arg: Array[Eval], ev: EvalScope, pos: Position): Val.Arr = { Val.Arr( pos, - arg.map(v => - new LazyWithComputeFunc(() => _func.apply1(v, pos.noOffset)(ev, TailstrictModeDisabled)) - ) + arg.map(v => new Lazy(() => _func.apply1(v, pos.noOffset)(ev, TailstrictModeDisabled))) ) } @@ -178,17 +176,15 @@ object ArrayModule extends AbstractFunctionModule { } private object MapWithIndex extends Val.Builtin2("mapWithIndex", "func", "arr") { - def evalRhs(_func: Lazy, _arr: Lazy, ev: EvalScope, pos: Position): Val = { - val func = _func.force.asFunc - val arr = _arr.force.asArr.asLazyArray - val a = new Array[Lazy](arr.length) + def evalRhs(_func: Eval, _arr: Eval, ev: EvalScope, pos: Position): Val = { + val func = _func.value.asFunc + val arr = _arr.value.asArr.asLazyArray + val a = new Array[Eval](arr.length) var i = 0 while (i < a.length) { val x = arr(i) val idx = Val.Num(pos, i) - a(i) = new LazyWithComputeFunc(() => - func.apply2(idx, x, pos.noOffset)(ev, TailstrictModeDisabled) - ) + a(i) = new Lazy(() => func.apply2(idx, x, pos.noOffset)(ev, TailstrictModeDisabled)) i += 1 } Val.Arr(pos, a) @@ -196,13 +192,13 @@ object ArrayModule extends AbstractFunctionModule { } private object Find extends Val.Builtin2("find", "value", "arr") { - def evalRhs(value: Lazy, _arr: Lazy, ev: EvalScope, pos: Position): Val = { - val arr = _arr.force.asArr - val b = new mutable.ArrayBuilder.ofRef[Lazy] + def evalRhs(value: Eval, _arr: Eval, ev: EvalScope, pos: Position): Val = { + val arr = _arr.value.asArr + val b = new mutable.ArrayBuilder.ofRef[Eval] b.sizeHint(arr.length) // Size hint based on array length (worst case) var i = 0 while (i < arr.length) { - if (ev.equal(arr.force(i), value.force)) { + if (ev.equal(arr.value(i), value.value)) { val finalI = i b.+=(Val.Num(pos, finalI)) } @@ -213,12 +209,12 @@ object ArrayModule extends AbstractFunctionModule { } private object FlattenArrays extends Val.Builtin1("flattenArrays", "arrs") { - def evalRhs(arrs: Lazy, ev: EvalScope, pos: Position): Val = { - val out = new mutable.ArrayBuilder.ofRef[Lazy] - val arr = arrs.force.asArr + def evalRhs(arrs: Eval, ev: EvalScope, pos: Position): Val = { + val out = new mutable.ArrayBuilder.ofRef[Eval] + val arr = arrs.value.asArr out.sizeHint(arr.length * 4) // Rough size hint for (x <- arr) { - x.force match { + x.value match { case Val.Null(_) => // do nothing case v: Val.Arr => out ++= v.asLazyArray case x => Error.fail("Cannot call flattenArrays on " + x) @@ -229,14 +225,14 @@ object ArrayModule extends AbstractFunctionModule { } private object FlattenDeepArrays extends Val.Builtin1("flattenDeepArray", "value") { - def evalRhs(value: Lazy, ev: EvalScope, pos: Position): Val = { - val lazyArray = value.force.asArr.asLazyArray - val out = new mutable.ArrayBuilder.ofRef[Lazy] + def evalRhs(value: Eval, ev: EvalScope, pos: Position): Val = { + val lazyArray = value.value.asArr.asLazyArray + val out = new mutable.ArrayBuilder.ofRef[Eval] out.sizeHint(lazyArray.length) - val q = new java.util.ArrayDeque[Lazy](lazyArray.length) + val q = new java.util.ArrayDeque[Eval](lazyArray.length) lazyArray.foreach(q.add) while (!q.isEmpty) { - q.removeFirst().force match { + q.removeFirst().value match { case v: Val.Arr => v.asLazyArray.reverseIterator.foreach(q.push) case x => out += x } @@ -246,25 +242,25 @@ object ArrayModule extends AbstractFunctionModule { } private object Reverse extends Val.Builtin1("reverse", "arrs") { - def evalRhs(arrs: Lazy, ev: EvalScope, pos: Position): Val = { - Val.Arr(pos, arrs.force.asArr.asLazyArray.reverse) + def evalRhs(arrs: Eval, ev: EvalScope, pos: Position): Val = { + Val.Arr(pos, arrs.value.asArr.asLazyArray.reverse) } } private object Member extends Val.Builtin2("member", "arr", "x") { - def evalRhs(arr: Lazy, x: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(arr: Eval, x: Eval, ev: EvalScope, pos: Position): Val = { Val.bool( pos, - arr.force match { + arr.value match { case str: Val.Str => - val secondArg = x.force match { + val secondArg = x.value match { case Val.Str(_, value) => value case n => Error.fail("std.member second argument must be a string, got " + n.prettyName) } - str.value.contains(secondArg) + str.str.contains(secondArg) case a: Val.Arr => - a.asLazyArray.indexWhere(v => ev.equal(v.force, x.force)) >= 0 + a.asLazyArray.indexWhere(v => ev.equal(v.value, x.value)) >= 0 case arr => Error.fail( "std.member first argument must be an array or a string, got " + arr.prettyName @@ -275,19 +271,19 @@ object ArrayModule extends AbstractFunctionModule { } private object Range extends Val.Builtin2("range", "from", "to") { - def evalRhs(from: Lazy, to: Lazy, ev: EvalScope, pos: Position): Val = + def evalRhs(from: Eval, to: Eval, ev: EvalScope, pos: Position): Val = Val.Arr( pos, - (from.force.asInt to to.force.asInt).map(i => Val.Num(pos, i)).toArray + (from.value.asInt to to.value.asInt).map(i => Val.Num(pos, i)).toArray ) } private object Foldl extends Val.Builtin3("foldl", "func", "arr", "init") { - def evalRhs(_func: Lazy, arr: Lazy, init: Lazy, ev: EvalScope, pos: Position): Val = { - val func = _func.force.asFunc - arr.force match { + def evalRhs(_func: Eval, arr: Eval, init: Eval, ev: EvalScope, pos: Position): Val = { + val func = _func.value.asFunc + arr.value match { case arr: Val.Arr => - var current = init.force + var current = init.value for (item <- arr.asLazyArray) { val c = current current = func.apply2(c, item, pos.noOffset)(ev, TailstrictModeDisabled) @@ -295,8 +291,8 @@ object ArrayModule extends AbstractFunctionModule { current case s: Val.Str => - var current = init.force - for (char <- s.value) { + var current = init.value + for (char <- s.str) { val c = current current = func.apply2(c, Val.Str(pos, new String(Array(char))), pos.noOffset)( ev, @@ -312,19 +308,19 @@ object ArrayModule extends AbstractFunctionModule { } private object Foldr extends Val.Builtin3("foldr", "func", "arr", "init") { - def evalRhs(_func: Lazy, arr: Lazy, init: Lazy, ev: EvalScope, pos: Position): Val = { - val func = _func.force.asFunc - arr.force match { + def evalRhs(_func: Eval, arr: Eval, init: Eval, ev: EvalScope, pos: Position): Val = { + val func = _func.value.asFunc + arr.value match { case arr: Val.Arr => - var current = init.force + var current = init.value for (item <- arr.asLazyArray.reverse) { val c = current current = func.apply2(item, c, pos.noOffset)(ev, TailstrictModeDisabled) } current case s: Val.Str => - var current = init.force - for (char <- s.value.reverse) { + var current = init.value + for (char <- s.str.reverse) { val c = current current = func.apply2(Val.Str(pos, new String(Array(char))), c, pos.noOffset)( ev, @@ -338,7 +334,7 @@ object ArrayModule extends AbstractFunctionModule { } private def stringChars(pos: Position, str: String): Val.Arr = { - val chars = new Array[Lazy](str.codePointCount(0, str.length)) + val chars = new Array[Eval](str.codePointCount(0, str.length)) var charIndex = 0 var i = 0 while (i < str.length) { @@ -384,20 +380,20 @@ object ArrayModule extends AbstractFunctionModule { case s: Val.Str => val builder = new java.lang.StringBuilder() var i = 0 - while (i < s.value.length) { - val codePoint = s.value.codePointAt(i) + while (i < s.str.length) { + val codePoint = s.str.codePointAt(i) val codepointStr = Character.toString(codePoint) val fres = func.apply1(Val.Str(pos, codepointStr), pos.noOffset)(ev, TailstrictModeDisabled) builder.append( fres match { - case fstr: Val.Str => fstr.value + case fstr: Val.Str => fstr.str case _: Val.Null => "" case x => Error.fail( "flatMap func must return string, got " + fres .asInstanceOf[Val] - .force + .value .prettyName ) } @@ -414,14 +410,12 @@ object ArrayModule extends AbstractFunctionModule { Val.Arr( pos, arr.asLazyArray.flatMap { i => - i.force + i.value if (!filter_func.apply1(i, pos.noOffset)(ev, TailstrictModeDisabled).asBoolean) { None } else { - Some[Lazy]( - new LazyWithComputeFunc(() => - map_func.apply1(i, pos.noOffset)(ev, TailstrictModeDisabled) - ) + Some[Eval]( + new Lazy(() => map_func.apply1(i, pos.noOffset)(ev, TailstrictModeDisabled)) ) } } @@ -439,7 +433,7 @@ object ArrayModule extends AbstractFunctionModule { Val.Str(pos, builder.toString()) case a: Val.Arr => val lazyArray = a.asLazyArray - val out = new mutable.ArrayBuilder.ofRef[Lazy] + val out = new mutable.ArrayBuilder.ofRef[Eval] out.sizeHint(lazyArray.length * count) var i = 0 while (i < count) { @@ -455,11 +449,11 @@ object ArrayModule extends AbstractFunctionModule { Val.Arr( pos, { val sz = size.cast[Val.Num].asPositiveInt - val a = new Array[Lazy](sz) + val a = new Array[Eval](sz) var i = 0 while (i < sz) { val forcedI = i - a(i) = new LazyWithComputeFunc(() => + a(i) = new Lazy(() => func.apply1(Val.Num(pos, forcedI), pos.noOffset)(ev, TailstrictModeDisabled) ) i += 1 @@ -469,10 +463,10 @@ object ArrayModule extends AbstractFunctionModule { ) }, builtin("contains", "arr", "elem") { (_, ev, arr: Val.Arr, elem: Val) => - arr.asLazyArray.indexWhere(s => ev.equal(s.force, elem)) != -1 + arr.asLazyArray.indexWhere(s => ev.equal(s.value, elem)) != -1 }, builtin("remove", "arr", "elem") { (_, ev, arr: Val.Arr, elem: Val) => - val idx = arr.asLazyArray.indexWhere(s => ev.equal(s.force, elem)) + val idx = arr.asLazyArray.indexWhere(s => ev.equal(s.value, elem)) if (idx == -1) { arr } else { @@ -495,7 +489,7 @@ object ArrayModule extends AbstractFunctionModule { if (!arr.forall(_.isInstanceOf[Val.Num])) { Error.fail("Argument must be an array of numbers") } - arr.asLazyArray.map(_.force.asDouble).sum + arr.asLazyArray.map(_.value.asDouble).sum }, builtin("avg", "arr") { (_, _, arr: Val.Arr) => if (!arr.forall(_.isInstanceOf[Val.Num])) { @@ -504,7 +498,7 @@ object ArrayModule extends AbstractFunctionModule { if (arr.length == 0) { Error.fail("Cannot calculate average of an empty array") } - arr.asLazyArray.map(_.force.asDouble).sum / arr.length + arr.asLazyArray.map(_.value.asDouble).sum / arr.length } ) } diff --git a/sjsonnet/src/sjsonnet/stdlib/EncodingModule.scala b/sjsonnet/src/sjsonnet/stdlib/EncodingModule.scala index bb56ec5d..dc467a38 100644 --- a/sjsonnet/src/sjsonnet/stdlib/EncodingModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/EncodingModule.scala @@ -9,8 +9,8 @@ object EncodingModule extends AbstractFunctionModule { def name = "encoding" private object MD5 extends Val.Builtin1("md5", "s") { - def evalRhs(s: Lazy, ev: EvalScope, pos: Position): Val = - Val.Str(pos, Platform.md5(s.force.asString)) + def evalRhs(s: Eval, ev: EvalScope, pos: Position): Val = + Val.Str(pos, Platform.md5(s.value.asString)) } val functions: Seq[(String, Val.Func)] = Seq( @@ -23,7 +23,7 @@ object EncodingModule extends AbstractFunctionModule { val byteArr = new Array[Byte](arr.length) var i = 0 while (i < arr.length) { - val v = arr.force(i) + val v = arr.value(i) if (!v.isInstanceOf[Val.Num]) { Error.fail(f"Expected an array of numbers, got a ${v.prettyName} at position $i") } diff --git a/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala b/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala index c6ca9418..9fcc3fe8 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala @@ -10,17 +10,17 @@ object ManifestModule extends AbstractFunctionModule { def name = "manifest" private object ManifestJson extends Val.Builtin1("manifestJson", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.Str(pos, Materializer.apply0(v.force, MaterializeJsonRenderer())(ev).toString) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.Str(pos, Materializer.apply0(v.value, MaterializeJsonRenderer())(ev).toString) } private object ManifestJsonMinified extends Val.Builtin1("manifestJsonMinified", "value") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = Val.Str( pos, Materializer .apply0( - v.force, + v.value, MaterializeJsonRenderer(indent = -1, newline = "", keyValueSeparator = ":") )(ev) .toString @@ -37,21 +37,21 @@ object ManifestModule extends AbstractFunctionModule { Array(null, null, Val.Str(dummyPos, "\n"), Val.Str(dummyPos, ": ")) ) { def evalRhs( - v: Lazy, - i: Lazy, - newline: Lazy, - keyValSep: Lazy, + v: Eval, + i: Eval, + newline: Eval, + keyValSep: Eval, ev: EvalScope, pos: Position): Val = Val.Str( pos, Materializer .apply0( - v.force, + v.value, MaterializeJsonRenderer( - indent = i.force.asString.length, - newline = newline.force.asString, - keyValueSeparator = keyValSep.force.asString + indent = i.value.asString.length, + newline = newline.value.asString, + keyValueSeparator = keyValSep.value.asString ) )(ev) .toString @@ -59,9 +59,9 @@ object ManifestModule extends AbstractFunctionModule { } private object ParseJson extends Val.Builtin1("parseJson", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = { try { - ujson.StringParser.transform(str.force.asString, new ValVisitor(pos)) + ujson.StringParser.transform(str.value.asString, new ValVisitor(pos)) } catch { case e: ujson.ParseException => throw Error.fail("Invalid JSON: " + e.getMessage, pos)(ev) @@ -70,8 +70,8 @@ object ManifestModule extends AbstractFunctionModule { } private object ParseYaml extends Val.Builtin1("parseYaml", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = { - val input = str.force.asString + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = { + val input = str.value.asString if (input.isEmpty) { return Val.Null(pos) } @@ -80,12 +80,12 @@ object ManifestModule extends AbstractFunctionModule { } private object ManifestTomlEx extends Val.Builtin2("manifestTomlEx", "value", "indent") { - private def isTableArray(v: Val) = v.force match { + private def isTableArray(v: Val) = v.value match { case s: Val.Arr => s.length > 0 && s.asLazyArray.forall(_.isInstanceOf[Val.Obj]) case _ => false } - private def isSection(v: Val) = v.force.isInstanceOf[Val.Obj] || isTableArray(v.force) + private def isSection(v: Val) = v.value.isInstanceOf[Val.Obj] || isTableArray(v.value) private def renderTableInternal( out: StringWriter, @@ -115,7 +115,7 @@ object ManifestModule extends AbstractFunctionModule { out.write('\n') renderTableInternal( out, - v0.asArr.force(i).asObj, + v0.asArr.value(i).asObj, cumulatedIndent + indent, indent, path :+ k, @@ -153,13 +153,13 @@ object ManifestModule extends AbstractFunctionModule { out } - def evalRhs(v: Lazy, indent: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(v: Eval, indent: Eval, ev: EvalScope, pos: Position): Val = { val out = new StringWriter renderTableInternal( out, - v.force.asObj, + v.value.asObj, "", - indent.force.asString, + indent.value.asString, Seq.empty[String], Seq.empty[String] )(ev) @@ -168,15 +168,15 @@ object ManifestModule extends AbstractFunctionModule { } private object Lines extends Val.Builtin1("lines", "arr") { - def evalRhs(v1: Lazy, ev: EvalScope, pos: Position): Val = { - v1.force.asArr.foreach { + def evalRhs(v1: Eval, ev: EvalScope, pos: Position): Val = { + v1.value.asArr.foreach { case _: Val.Str | _: Val.Null => // donothing - case x => Error.fail("Cannot call .lines on " + x.force.prettyName) + case x => Error.fail("Cannot call .lines on " + x.value.prettyName) } Val.Str( pos, Materializer - .apply(v1.force)(ev) + .apply(v1.value)(ev) .asInstanceOf[ujson.Arr] .value .filter(_ != ujson.Null) @@ -191,14 +191,14 @@ object ManifestModule extends AbstractFunctionModule { } private object DeepJoin extends Val.Builtin1("deepJoin", "arr") { - def evalRhs(value: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(value: Eval, ev: EvalScope, pos: Position): Val = { val out = new StringWriter() - val q = new java.util.ArrayDeque[Lazy]() + val q = new java.util.ArrayDeque[Eval]() q.add(value) while (!q.isEmpty) { - q.removeFirst().force match { + q.removeFirst().value match { case v: Val.Arr => v.asLazyArray.reverseIterator.foreach(q.push) - case s: Val.Str => out.write(s.value) + case s: Val.Str => out.write(s.str) case s => Error.fail("Cannot call deepJoin on " + s.prettyName) } } @@ -271,7 +271,7 @@ object ManifestModule extends AbstractFunctionModule { .map { item => Materializer .apply0( - item.force, + item.value, new YamlRenderer(indentArrayInObject = indentArrayInObject, quoteKeys = quoteKeys) )(ev) .toString diff --git a/sjsonnet/src/sjsonnet/stdlib/MathModule.scala b/sjsonnet/src/sjsonnet/stdlib/MathModule.scala index f114c848..bc2a8fa4 100644 --- a/sjsonnet/src/sjsonnet/stdlib/MathModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/MathModule.scala @@ -19,10 +19,10 @@ object MathModule extends AbstractFunctionModule { ( "mod", new Val.Builtin2("mod", "a", "b") { - def evalRhs(a: Lazy, b: Lazy, ev: EvalScope, pos: Position): Val = { - (a.force, b.force) match { + def evalRhs(a: Eval, b: Eval, ev: EvalScope, pos: Position): Val = { + (a.value, b.value) match { case (x: Val.Num, y: Val.Num) => Val.Num(pos, x.asDouble % y.asDouble) - case _ => Val.Str(pos, Format.format(a.force.asString, b.force, pos)(ev)) + case _ => Val.Str(pos, Format.format(a.value.asString, b.value, pos)(ev)) } } } diff --git a/sjsonnet/src/sjsonnet/stdlib/NativeRegex.scala b/sjsonnet/src/sjsonnet/stdlib/NativeRegex.scala index ffd0d0a9..df06fe2c 100644 --- a/sjsonnet/src/sjsonnet/stdlib/NativeRegex.scala +++ b/sjsonnet/src/sjsonnet/stdlib/NativeRegex.scala @@ -45,42 +45,42 @@ object NativeRegex extends AbstractFunctionModule { val functions: Seq[(String, Val.Builtin)] = Seq( "regexPartialMatch" -> new Val.Builtin2("regexPartialMatch", "pattern", "str") { - override def evalRhs(pattern: Lazy, str: Lazy, ev: EvalScope, pos: Position): Val = { - regexPartialMatch(pos, pattern.force.asString, str.force.asString) + override def evalRhs(pattern: Eval, str: Eval, ev: EvalScope, pos: Position): Val = { + regexPartialMatch(pos, pattern.value.asString, str.value.asString) } }, "regexFullMatch" -> new Val.Builtin2("regexFullMatch", "pattern", "str") { - override def evalRhs(pattern: Lazy, str: Lazy, ev: EvalScope, pos: Position): Val = { - regexPartialMatch(pos, s"^${pattern.force.asString}$$", str.force.asString) + override def evalRhs(pattern: Eval, str: Eval, ev: EvalScope, pos: Position): Val = { + regexPartialMatch(pos, s"^${pattern.value.asString}$$", str.value.asString) } }, "regexGlobalReplace" -> new Val.Builtin3("regexGlobalReplace", "str", "pattern", "to") { override def evalRhs( - str: Lazy, - pattern: Lazy, - to: Lazy, + str: Eval, + pattern: Eval, + to: Eval, ev: EvalScope, pos: Position): Val = { - val compiledPattern = Platform.getPatternFromCache(pattern.force.asString) - val matcher = compiledPattern.matcher(str.force.asString) - Val.Str(pos.noOffset, matcher.replaceAll(to.force.asString)) + val compiledPattern = Platform.getPatternFromCache(pattern.value.asString) + val matcher = compiledPattern.matcher(str.value.asString) + Val.Str(pos.noOffset, matcher.replaceAll(to.value.asString)) } }, "regexReplace" -> new Val.Builtin3("regexReplace", "str", "pattern", "to") { override def evalRhs( - str: Lazy, - pattern: Lazy, - to: Lazy, + str: Eval, + pattern: Eval, + to: Eval, ev: EvalScope, pos: Position): Val = { - val compiledPattern = Platform.getPatternFromCache(pattern.force.asString) - val matcher = compiledPattern.matcher(str.force.asString) - Val.Str(pos.noOffset, matcher.replaceFirst(to.force.asString)) + val compiledPattern = Platform.getPatternFromCache(pattern.value.asString) + val matcher = compiledPattern.matcher(str.value.asString) + Val.Str(pos.noOffset, matcher.replaceFirst(to.value.asString)) } }, "regexQuoteMeta" -> new Val.Builtin1("regexQuoteMeta", "str") { - override def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = { - Val.Str(pos.noOffset, Platform.regexQuote(str.force.asString)) + override def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = { + Val.Str(pos.noOffset, Platform.regexQuote(str.value.asString)) } } ) diff --git a/sjsonnet/src/sjsonnet/stdlib/ObjectModule.scala b/sjsonnet/src/sjsonnet/stdlib/ObjectModule.scala index 9d3860e7..2fa5b0ef 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ObjectModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ObjectModule.scala @@ -8,67 +8,67 @@ object ObjectModule extends AbstractFunctionModule { def name = "object" private object ObjectHas extends Val.Builtin2("objectHas", "o", "f") { - def evalRhs(o: Lazy, f: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, o.force.asObj.containsVisibleKey(f.force.asString)) + def evalRhs(o: Eval, f: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, o.value.asObj.containsVisibleKey(f.value.asString)) override def specialize(args: Array[Expr], tailstrict: Boolean): (Val.Builtin, Array[Expr]) = args match { - case Array(o, s: Val.Str) => (new SpecF(s.value), Array(o)) + case Array(o, s: Val.Str) => (new SpecF(s.str), Array(o)) case _ => null } private class SpecF(f: String) extends Val.Builtin1("objectHas", "o") { - def evalRhs(o: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, o.force.asObj.containsVisibleKey(f)) + def evalRhs(o: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, o.value.asObj.containsVisibleKey(f)) } } private object ObjectHasAll extends Val.Builtin2("objectHasAll", "o", "f") { - def evalRhs(o: Lazy, f: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, o.force.asObj.containsKey(f.force.asString)) + def evalRhs(o: Eval, f: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, o.value.asObj.containsKey(f.value.asString)) override def specialize(args: Array[Expr], tailstrict: Boolean): (Val.Builtin, Array[Expr]) = args match { - case Array(o, s: Val.Str) => (new SpecF(s.value), Array(o)) + case Array(o, s: Val.Str) => (new SpecF(s.str), Array(o)) case _ => null } class SpecF(f: String) extends Val.Builtin1("objectHasAll", "o") { - def evalRhs(o: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, o.force.asObj.containsKey(f)) + def evalRhs(o: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, o.value.asObj.containsKey(f)) } } private object ObjectFields extends Val.Builtin1("objectFields", "o") { - def evalRhs(o: Lazy, ev: EvalScope, pos: Position): Val = { - val keys = getVisibleKeys(ev, o.force.asObj) + def evalRhs(o: Eval, ev: EvalScope, pos: Position): Val = { + val keys = getVisibleKeys(ev, o.value.asObj) Val.Arr(pos, keys.map(k => Val.Str(pos, k))) } } private object ObjectFieldsAll extends Val.Builtin1("objectFieldsAll", "o") { - def evalRhs(o: Lazy, ev: EvalScope, pos: Position): Val = { - val keys = getAllKeys(ev, o.force.asObj) + def evalRhs(o: Eval, ev: EvalScope, pos: Position): Val = { + val keys = getAllKeys(ev, o.value.asObj) Val.Arr(pos, keys.map(k => Val.Str(pos, k))) } } private object ObjectFieldsEx extends Val.Builtin2("objectFieldsEx", "o", "inc_hidden") { - def evalRhs(o: Lazy, incHidden: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(o: Eval, incHidden: Eval, ev: EvalScope, pos: Position): Val = { val keys = - if (incHidden.force.asBoolean) getAllKeys(ev, o.force.asObj) - else getVisibleKeys(ev, o.force.asObj) + if (incHidden.value.asBoolean) getAllKeys(ev, o.value.asObj) + else getVisibleKeys(ev, o.value.asObj) Val.Arr(pos, keys.map(k => Val.Str(pos, k))) } } private object ObjectValues extends Val.Builtin1("objectValues", "o") { - def evalRhs(_o: Lazy, ev: EvalScope, pos: Position): Val = { - val o = _o.force.asObj + def evalRhs(_o: Eval, ev: EvalScope, pos: Position): Val = { + val o = _o.value.asObj val keys = getVisibleKeys(ev, o) getObjValuesFromKeys(pos, ev, o, keys) } } private object ObjectValuesAll extends Val.Builtin1("objectValuesAll", "o") { - def evalRhs(_o: Lazy, ev: EvalScope, pos: Position): Val = { - val o = _o.force.asObj + def evalRhs(_o: Eval, ev: EvalScope, pos: Position): Val = { + val o = _o.value.asObj val keys = getAllKeys(ev, o) getObjValuesFromKeys(pos, ev, o, keys) } @@ -80,24 +80,24 @@ object ObjectModule extends AbstractFunctionModule { Array("o", "f", "default", "inc_hidden"), Array(null, null, Val.Null(dummyPos), Val.True(dummyPos)) ) { - override def evalRhs(args: Array[? <: Lazy], ev: EvalScope, pos: Position): Val = { - val obj = args(0).force.asObj - val k = args(1).force.asString - val incHidden = args(3).force.asBoolean + override def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = { + val obj = args(0).value.asObj + val k = args(1).value.asString + val incHidden = args(3).value.asBoolean if (incHidden && obj.containsKey(k)) { obj.value(k, pos.noOffset, obj)(ev) } else if (!incHidden && obj.containsVisibleKey(k)) { obj.value(k, pos.noOffset, obj)(ev) } else { - args(2).force + args(2).value } } } private object MapWithKey extends Val.Builtin2("mapWithKey", "func", "obj") { - def evalRhs(_func: Lazy, _obj: Lazy, ev: EvalScope, pos: Position): Val = { - val func = _func.force.asFunc - val obj = _obj.force.asObj + def evalRhs(_func: Eval, _obj: Eval, ev: EvalScope, pos: Position): Val = { + val func = _func.value.asFunc + val obj = _obj.value.asObj val allKeys = obj.allKeyNames val m = Util.preSizedJavaLinkedHashMap[String, Val.Obj.Member](allKeys.length) var i = 0 @@ -107,7 +107,7 @@ object ObjectModule extends AbstractFunctionModule { def invoke(self: Val.Obj, sup: Val.Obj, fs: FileScope, ev: EvalScope): Val = func.apply2( Val.Str(pos, k), - new LazyWithComputeFunc(() => obj.value(k, pos.noOffset)(ev)), + new Lazy(() => obj.value(k, pos.noOffset)(ev)), pos.noOffset )( ev, @@ -139,7 +139,7 @@ object ObjectModule extends AbstractFunctionModule { Val.Arr( pos, keys.map { k => - new LazyWithComputeFunc(() => v1.value(k, pos.noOffset)(ev)) + new Lazy(() => v1.value(k, pos.noOffset)(ev)) } ) @@ -322,7 +322,7 @@ object ObjectModule extends AbstractFunctionModule { (lKeys ++ rKeys).distinct } } - recPair(target.force, patch.force) + recPair(target.value, patch.value) }, builtin("prune", "a") { (pos, ev, s: Val) => def filter(x: Val) = x match { @@ -331,7 +331,7 @@ object ObjectModule extends AbstractFunctionModule { case Val.Null(_) => false case _ => true } - def rec(x: Lazy): Val = x.force match { + def rec(x: Eval): Val = x.value match { case o: Val.Obj => val bindings: Array[(String, Val.Obj.Member)] = for { k <- o.visibleKeyNames diff --git a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala index f63d8f9a..fc6558d5 100644 --- a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala @@ -10,15 +10,15 @@ object SetModule extends AbstractFunctionModule { def name = "set" private object Set_ extends Val.Builtin2("set", "arr", "keyF", Array(null, Val.False(dummyPos))) { - def evalRhs(arr: Lazy, keyF: Lazy, ev: EvalScope, pos: Position): Val = { - uniqArr(pos, ev, sortArr(pos, ev, arr.force, keyF.force), keyF.force) + def evalRhs(arr: Eval, keyF: Eval, ev: EvalScope, pos: Position): Val = { + uniqArr(pos, ev, sortArr(pos, ev, arr.value, keyF.value), keyF.value) } } private def applyKeyFunc(elem: Val, keyF: Val, pos: Position, ev: EvalScope): Val = { keyF match { case keyFFunc: Val.Func => - keyFFunc.apply1(elem, pos.noOffset)(ev, TailstrictModeDisabled).force + keyFFunc.apply1(elem, pos.noOffset)(ev, TailstrictModeDisabled).value case _ => elem } } @@ -26,7 +26,7 @@ object SetModule extends AbstractFunctionModule { private def toArrOrString(arg: Val, pos: Position, ev: EvalScope) = { arg match { case arr: Val.Arr => arr.asLazyArray - case str: Val.Str => stringChars(pos, str.value).asLazyArray + case str: Val.Str => stringChars(pos, str.str).asLazyArray case _ => Error.fail(f"Argument must be either arrays or strings") } } @@ -35,7 +35,7 @@ object SetModule extends AbstractFunctionModule { if (ev.settings.throwErrorForInvalidSets) { val sorted = uniqArr(pos.noOffset, ev, sortArr(pos.noOffset, ev, arr, keyF), keyF) if (!ev.equal(arr, sorted)) { - Error.fail("Set operation on " + arr.force.prettyName + " was called with a non-set") + Error.fail("Set operation on " + arr.value.prettyName + " was called with a non-set") } } } @@ -44,13 +44,13 @@ object SetModule extends AbstractFunctionModule { ev: EvalScope, pos: Position, keyF: Val, - arr: mutable.IndexedSeq[? <: Lazy], + arr: mutable.IndexedSeq[? <: Eval], toFind: Val): Boolean = { val appliedX = applyKeyFunc(toFind, keyF, pos, ev) arr - .search(appliedX)((toFind: Lazy, value: Lazy) => { - val appliedValue = applyKeyFunc(value.force, keyF, pos, ev) - ev.compare(toFind.force, appliedValue) + .search(appliedX)((toFind: Eval, value: Eval) => { + val appliedValue = applyKeyFunc(value.value, keyF, pos, ev) + ev.compare(toFind.value, appliedValue) }) .isInstanceOf[Found] } @@ -61,7 +61,7 @@ object SetModule extends AbstractFunctionModule { return arr } - val out = new mutable.ArrayBuilder.ofRef[Lazy] + val out = new mutable.ArrayBuilder.ofRef[Eval] // Set a reasonable size hint - in the worst case (no duplicates), we'll need arrValue.length elements out.sizeHint(arrValue.length) @@ -70,7 +70,7 @@ object SetModule extends AbstractFunctionModule { while (i < arrValue.length) { val v = arrValue(i) val vKey = - if (keyF.isInstanceOf[Val.False]) v.force + if (keyF.isInstanceOf[Val.False]) v.value else keyF.asInstanceOf[Val.Func].apply1(v, pos.noOffset)(ev, TailstrictModeDisabled) if (lastAddedKey == null || !ev.equal(vKey, lastAddedKey)) { out.+=(v) @@ -93,7 +93,7 @@ object SetModule extends AbstractFunctionModule { pos, if (keyFFunc != null) { val keys: Array[Val] = vs.map(v => - keyFFunc(Array(v.force), null, pos.noOffset)(ev, TailstrictModeDisabled).force + keyFFunc(Array(v.value), null, pos.noOffset)(ev, TailstrictModeDisabled).value ) val keyType = keys(0).getClass if (classOf[Val.Bool].isAssignableFrom(keyType)) { @@ -117,23 +117,24 @@ object SetModule extends AbstractFunctionModule { sortedIndices.map(i => vs(i)) } else { - val keyType = vs(0).force.getClass + val strict = vs.map(_.value) + val keyType = strict(0).getClass if (classOf[Val.Bool].isAssignableFrom(keyType)) { Error.fail("Cannot sort with values that are booleans") } - if (!vs.forall(_.force.getClass == keyType)) + if (!strict.forall(_.getClass == keyType)) Error.fail("Cannot sort with values that are not all the same type") if (keyType == classOf[Val.Str]) { - vs.map(_.force.cast[Val.Str]).sortBy(_.asString)(Util.CodepointStringOrdering) + strict.map(_.cast[Val.Str]).sortBy(_.asString)(Util.CodepointStringOrdering) } else if (keyType == classOf[Val.Num]) { - vs.map(_.force.cast[Val.Num]).sortBy(_.asDouble) + strict.map(_.cast[Val.Num]).sortBy(_.asDouble) } else if (keyType == classOf[Val.Arr]) { - vs.map(_.force.cast[Val.Arr]).sortBy(identity)(ev.compare(_, _)) + strict.map(_.cast[Val.Arr]).sortBy(identity)(ev.compare(_, _)) } else if (keyType == classOf[Val.Obj]) { Error.fail("Unable to sort array of objects without key function") } else { - Error.fail("Cannot sort array of " + vs(0).force.prettyName) + Error.fail("Cannot sort array of " + strict(0).prettyName) } } ) @@ -141,7 +142,7 @@ object SetModule extends AbstractFunctionModule { } def stringChars(pos: Position, str: String): Val.Arr = { - val chars = new Array[Lazy](str.codePointCount(0, str.length)) + val chars = new Array[Eval](str.codePointCount(0, str.length)) var charIndex = 0 var i = 0 while (i < str.length) { @@ -179,15 +180,15 @@ object SetModule extends AbstractFunctionModule { } else if (b.isEmpty) { args(0) } else { - val out = new mutable.ArrayBuilder.ofRef[Lazy] + val out = new mutable.ArrayBuilder.ofRef[Eval] out.sizeHint(a.length + b.length) var idxA = 0 var idxB = 0 while (idxA < a.length && idxB < b.length) { - val elemA = a(idxA).force - val elemB = b(idxB).force + val elemA = a(idxA).value + val elemB = b(idxB).value val keyA = applyKeyFunc(elemA, keyF, pos, ev) val keyB = applyKeyFunc(elemB, keyF, pos, ev) @@ -231,7 +232,7 @@ object SetModule extends AbstractFunctionModule { val a = toArrOrString(args(0), pos, ev) val b = toArrOrString(args(1), pos, ev) - val out = new mutable.ArrayBuilder.ofRef[Lazy] + val out = new mutable.ArrayBuilder.ofRef[Eval] // Set a reasonable size hint - intersection will be at most the size of the smaller set out.sizeHint(math.min(a.length, b.length)) @@ -239,8 +240,8 @@ object SetModule extends AbstractFunctionModule { var idxB = 0 while (idxA < a.length && idxB < b.length) { - val elemA = a(idxA).force - val elemB = b(idxB).force + val elemA = a(idxA).value + val elemB = b(idxB).value val keyA = applyKeyFunc(elemA, keyF, pos, ev) val keyB = applyKeyFunc(elemB, keyF, pos, ev) @@ -270,7 +271,7 @@ object SetModule extends AbstractFunctionModule { val a = toArrOrString(args(0), pos, ev) val b = toArrOrString(args(1), pos, ev) - val out = new mutable.ArrayBuilder.ofRef[Lazy] + val out = new mutable.ArrayBuilder.ofRef[Eval] // Set a reasonable size hint - difference will be at most the size of the first set out.sizeHint(a.length) @@ -278,14 +279,14 @@ object SetModule extends AbstractFunctionModule { var idxB = 0 while (idxA < a.length) { - val elemA = a(idxA).force + val elemA = a(idxA).value val keyA = applyKeyFunc(elemA, keyF, pos, ev) // Advance idxB to find first element >= keyA var foundEqual = false var continue = true while (idxB < b.length && continue) { - val elemB = b(idxB).force + val elemB = b(idxB).value val keyB = applyKeyFunc(elemB, keyF, pos, ev) val cmp = ev.compare(keyA, keyB) diff --git a/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala b/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala index d8398d9a..378fbc84 100644 --- a/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala @@ -17,8 +17,8 @@ final class StdLibModule( // Override the native function to use the provided native functions private def nativeFunction = new Val.Builtin1("native", "name") { - def evalRhs(name: Lazy, ev: EvalScope, pos: Position): Val = - nativeFunctions.getOrElse(name.force.asString, Val.Null(pos)) + def evalRhs(name: Eval, ev: EvalScope, pos: Position): Val = + nativeFunctions.getOrElse(name.value.asString, Val.Null(pos)) } // All functions including native and additional functions @@ -57,17 +57,17 @@ object StdLibModule { // Core std library functions that belong directly in StdLibModule private val traceFunction = new Val.Builtin2("trace", "str", "rest") { - def evalRhs(str: Lazy, rest: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(str: Eval, rest: Eval, ev: EvalScope, pos: Position): Val = { ev.trace( - s"TRACE: ${pos.fileScope.currentFileLastPathElement} " + str.force.asString + s"TRACE: ${pos.fileScope.currentFileLastPathElement} " + str.value.asString ) - rest.force + rest.value } } private val extVarFunction = new Val.Builtin1("extVar", "x") { - def evalRhs(_x: Lazy, ev: EvalScope, pos: Position): Val = { - val x = _x.force.asString + def evalRhs(_x: Eval, ev: EvalScope, pos: Position): Val = { + val x = _x.value.asString ev.visitExpr(ev.extVars(x).getOrElse(Error.fail("Unknown extVar: " + x)))(ValScope.empty) } diff --git a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala index d7c01dfb..34428315 100644 --- a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala @@ -12,9 +12,9 @@ object StringModule extends AbstractFunctionModule { private val whiteSpaces = StripUtils.codePointsSet(" \t\n\f\r\u0085\u00A0") private object ToString extends Val.Builtin1("toString", "a") { - def evalRhs(v1: Lazy, ev: EvalScope, pos: Position): Val = Val.Str( + def evalRhs(v1: Eval, ev: EvalScope, pos: Position): Val = Val.Str( pos, - v1.force match { + v1.value match { case Val.Str(_, s) => s case v => Materializer.stringify(v)(ev) } @@ -22,10 +22,10 @@ object StringModule extends AbstractFunctionModule { } private object Length extends Val.Builtin1("length", "x") { - def evalRhs(x: Lazy, ev: EvalScope, pos: Position): Val = + def evalRhs(x: Eval, ev: EvalScope, pos: Position): Val = Val.Num( pos, - x.force match { + x.value match { case Val.Str(_, s) => s.codePointCount(0, s.length) case a: Val.Arr => a.length case o: Val.Obj => o.visibleKeyNames.length @@ -36,8 +36,8 @@ object StringModule extends AbstractFunctionModule { } private object Codepoint extends Val.Builtin1("codepoint", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = { - val s = str.force.asString + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = { + val s = str.value.asString val codePointCount = s.codePointCount(0, s.length) if (codePointCount != 1) { Error.fail("expected a single character string, got " + s) @@ -48,15 +48,15 @@ object StringModule extends AbstractFunctionModule { } private object Substr extends Val.Builtin3("substr", "str", "from", "len") { - def evalRhs(_s: Lazy, from: Lazy, len: Lazy, ev: EvalScope, pos: Position): Val = { - val str = _s.force.asString - val offset = from.force match { + def evalRhs(_s: Eval, from: Eval, len: Eval, ev: EvalScope, pos: Position): Val = { + val str = _s.value.asString + val offset = from.value match { case v: Val.Num => v.asPositiveInt - case _ => Error.fail("Expected a number for offset in substr, got " + from.force.prettyName) + case _ => Error.fail("Expected a number for offset in substr, got " + from.value.prettyName) } - val length = len.force match { + val length = len.value match { case v: Val.Num => v.asPositiveInt - case _ => Error.fail("Expected a number for len in substr, got " + len.force.prettyName) + case _ => Error.fail("Expected a number for len in substr, got " + len.value.prettyName) } val unicodeLength = str.codePointCount(0, str.length) @@ -74,18 +74,18 @@ object StringModule extends AbstractFunctionModule { } private object StartsWith extends Val.Builtin2("startsWith", "a", "b") { - def evalRhs(a: Lazy, b: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, a.force.asString.startsWith(b.force.asString)) + def evalRhs(a: Eval, b: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, a.value.asString.startsWith(b.value.asString)) } private object EndsWith extends Val.Builtin2("endsWith", "a", "b") { - def evalRhs(a: Lazy, b: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, a.force.asString.endsWith(b.force.asString)) + def evalRhs(a: Eval, b: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, a.value.asString.endsWith(b.value.asString)) } private object Char_ extends Val.Builtin1("char", "n") { - def evalRhs(n: Lazy, ev: EvalScope, pos: Position): Val = { - val c = n.force.asInt + def evalRhs(n: Eval, ev: EvalScope, pos: Position): Val = { + val c = n.value.asInt if (!Character.isValidCodePoint(c)) { Error.fail(s"Invalid unicode code point, got " + c) } @@ -94,12 +94,12 @@ object StringModule extends AbstractFunctionModule { } private object StrReplace extends Val.Builtin3("strReplace", "str", "from", "to") { - def evalRhs(str: Lazy, from: Lazy, to: Lazy, ev: EvalScope, pos: Position): Val = { - val fromForce = from.force.asString + def evalRhs(str: Eval, from: Eval, to: Eval, ev: EvalScope, pos: Position): Val = { + val fromForce = from.value.asString if (fromForce.isEmpty) { Error.fail("Cannot replace empty string in strReplace") } - Val.Str(pos, str.force.asString.replace(fromForce, to.force.asString)) + Val.Str(pos, str.value.asString.replace(fromForce, to.value.asString)) } } @@ -140,12 +140,12 @@ object StringModule extends AbstractFunctionModule { } private object StripChars extends Val.Builtin2("stripChars", "str", "chars") { - def evalRhs(str: Lazy, chars: Lazy, ev: EvalScope, pos: Position): Val = { - val charsSet = StripUtils.codePointsSet(chars.force.asString) + def evalRhs(str: Eval, chars: Eval, ev: EvalScope, pos: Position): Val = { + val charsSet = StripUtils.codePointsSet(chars.value.asString) Val.Str( pos, StripUtils.unspecializedStrip( - str.force.asString, + str.value.asString, charsSet, left = true, right = true @@ -155,12 +155,12 @@ object StringModule extends AbstractFunctionModule { } private object LStripChars extends Val.Builtin2("lstripChars", "str", "chars") { - def evalRhs(str: Lazy, chars: Lazy, ev: EvalScope, pos: Position): Val = { - val charsSet = StripUtils.codePointsSet(chars.force.asString) + def evalRhs(str: Eval, chars: Eval, ev: EvalScope, pos: Position): Val = { + val charsSet = StripUtils.codePointsSet(chars.value.asString) Val.Str( pos, StripUtils.unspecializedStrip( - str.force.asString, + str.value.asString, charsSet, left = true, right = false @@ -170,12 +170,12 @@ object StringModule extends AbstractFunctionModule { } private object RStripChars extends Val.Builtin2("rstripChars", "str", "chars") { - def evalRhs(str: Lazy, chars: Lazy, ev: EvalScope, pos: Position): Val = { - val charsSet = StripUtils.codePointsSet(chars.force.asString) + def evalRhs(str: Eval, chars: Eval, ev: EvalScope, pos: Position): Val = { + val charsSet = StripUtils.codePointsSet(chars.value.asString) Val.Str( pos, StripUtils.unspecializedStrip( - str.force.asString, + str.value.asString, charsSet, left = false, right = true @@ -185,15 +185,15 @@ object StringModule extends AbstractFunctionModule { } private object Join extends Val.Builtin2("join", "sep", "arr") { - def evalRhs(sep: Lazy, _arr: Lazy, ev: EvalScope, pos: Position): Val = { - val arr = implicitly[ReadWriter[Val.Arr]].apply(_arr.force) - sep.force match { + def evalRhs(sep: Eval, _arr: Eval, ev: EvalScope, pos: Position): Val = { + val arr = implicitly[ReadWriter[Val.Arr]].apply(_arr.value) + sep.value match { case Val.Str(_, s) => val b = new java.lang.StringBuilder() var i = 0 var added = false while (i < arr.length) { - arr.force(i) match { + arr.value(i) match { case _: Val.Null => case Val.Str(_, x) => if (added) b.append(s) @@ -205,7 +205,7 @@ object StringModule extends AbstractFunctionModule { } Val.Str(pos, b.toString) case sep: Val.Arr => - val out = new mutable.ArrayBuilder.ofRef[Lazy] + val out = new mutable.ArrayBuilder.ofRef[Eval] // Set a reasonable size hint based on estimated result size out.sizeHint(arr.length * 2) var added = false @@ -225,7 +225,7 @@ object StringModule extends AbstractFunctionModule { } } - private def splitLimit(pos: Position, str: String, cStr: String, maxSplits: Int): Array[Lazy] = { + private def splitLimit(pos: Position, str: String, cStr: String, maxSplits: Int): Array[Eval] = { if (maxSplits < 0 && maxSplits != -1) { Error.fail("maxSplits should be -1 or non-negative, got " + maxSplits) } @@ -233,7 +233,7 @@ object StringModule extends AbstractFunctionModule { Error.fail("Cannot split by an empty string") } - val b = new mutable.ArrayBuilder.ofRef[Lazy] + val b = new mutable.ArrayBuilder.ofRef[Eval] b.sizeHint(maxSplits) var sz = 0 var i = 0 @@ -256,67 +256,67 @@ object StringModule extends AbstractFunctionModule { } private object Split extends Val.Builtin2("split", "str", "c") { - def evalRhs(str: Lazy, c: Lazy, ev: EvalScope, pos: Position): Val = { - Val.Arr(pos, splitLimit(pos, str.force.asString, c.force.asString, -1)) + def evalRhs(str: Eval, c: Eval, ev: EvalScope, pos: Position): Val = { + Val.Arr(pos, splitLimit(pos, str.value.asString, c.value.asString, -1)) } } private object SplitLimit extends Val.Builtin3("splitLimit", "str", "c", "maxsplits") { - def evalRhs(str: Lazy, c: Lazy, maxSplits: Lazy, ev: EvalScope, pos: Position): Val = { - Val.Arr(pos, splitLimit(pos, str.force.asString, c.force.asString, maxSplits.force.asInt)) + def evalRhs(str: Eval, c: Eval, maxSplits: Eval, ev: EvalScope, pos: Position): Val = { + Val.Arr(pos, splitLimit(pos, str.value.asString, c.value.asString, maxSplits.value.asInt)) } } private object SplitLimitR extends Val.Builtin3("splitLimitR", "str", "c", "maxsplits") { - def evalRhs(str: Lazy, c: Lazy, maxSplits: Lazy, ev: EvalScope, pos: Position): Val = { + def evalRhs(str: Eval, c: Eval, maxSplits: Eval, ev: EvalScope, pos: Position): Val = { Val.Arr( pos, - splitLimit(pos, str.force.asString.reverse, c.force.asString.reverse, maxSplits.force.asInt) - .map(s => Val.Str(pos, s.force.force.asString.reverse)) + splitLimit(pos, str.value.asString.reverse, c.value.asString.reverse, maxSplits.value.asInt) + .map(s => Val.Str(pos, s.value.asString.reverse)) .reverse ) } } private object StringChars extends Val.Builtin1("stringChars", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = - stringChars(pos, str.force.asString) + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = + stringChars(pos, str.value.asString) } private object ParseInt extends Val.Builtin1("parseInt", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = try { - Val.Num(pos, str.force.asString.toLong.toDouble) + Val.Num(pos, str.value.asString.toLong.toDouble) } catch { case _: NumberFormatException => - Error.fail("Cannot parse '" + str.force.asString + "' as an integer in base 10") + Error.fail("Cannot parse '" + str.value.asString + "' as an integer in base 10") } } private object ParseOctal extends Val.Builtin1("parseOctal", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = - Val.Num(pos, java.lang.Long.parseLong(str.force.asString, 8).toDouble) + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = + Val.Num(pos, java.lang.Long.parseLong(str.value.asString, 8).toDouble) } private object ParseHex extends Val.Builtin1("parseHex", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = - Val.Num(pos, java.lang.Long.parseLong(str.force.asString, 16).toDouble) + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = + Val.Num(pos, java.lang.Long.parseLong(str.value.asString, 16).toDouble) } private object AsciiUpper extends Val.Builtin1("asciiUpper", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = - Val.Str(pos, str.force.asString.toUpperCase) + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = + Val.Str(pos, str.value.asString.toUpperCase) } private object AsciiLower extends Val.Builtin1("asciiLower", "str") { - def evalRhs(str: Lazy, ev: EvalScope, pos: Position): Val = - Val.Str(pos, str.force.asString.toLowerCase) + def evalRhs(str: Eval, ev: EvalScope, pos: Position): Val = + Val.Str(pos, str.value.asString.toLowerCase) } private object EncodeUTF8 extends Val.Builtin1("encodeUTF8", "str") { - def evalRhs(s: Lazy, ev: EvalScope, pos: Position): Val = { - val bytes = s.force.asString.getBytes(UTF_8) - val arr = new Array[Lazy](bytes.length) + def evalRhs(s: Eval, ev: EvalScope, pos: Position): Val = { + val bytes = s.value.asString.getBytes(UTF_8) + val arr = new Array[Eval](bytes.length) var i = 0 while (i < bytes.length) { arr(i) = Val.Num(pos, bytes(i) & 0xff) @@ -327,8 +327,8 @@ object StringModule extends AbstractFunctionModule { } private object DecodeUTF8 extends Val.Builtin1("decodeUTF8", "arr") { - def evalRhs(arr: Lazy, ev: EvalScope, pos: Position): Val = { - for ((v, idx) <- arr.force.asArr.iterator.zipWithIndex) { + def evalRhs(arr: Eval, ev: EvalScope, pos: Position): Val = { + for ((v, idx) <- arr.value.asArr.iterator.zipWithIndex) { if (!v.isInstanceOf[Val.Num] || !v.asDouble.isWhole || v.asInt < 0 || v.asInt > 255) { throw Error.fail( f"Element $idx of the provided array was not an integer in range [0,255]" @@ -337,25 +337,25 @@ object StringModule extends AbstractFunctionModule { } Val.Str( pos, - new String(arr.force.asArr.iterator.map(_.asInt.toByte).toArray, UTF_8) + new String(arr.value.asArr.iterator.map(_.asInt.toByte).toArray, UTF_8) ) } } private object Format_ extends Val.Builtin2("format", "str", "vals") { - def evalRhs(str: Lazy, vals: Lazy, ev: EvalScope, pos: Position): Val = - Val.Str(pos, Format.format(str.force.asString, vals.force, pos)(ev)) + def evalRhs(str: Eval, vals: Eval, ev: EvalScope, pos: Position): Val = + Val.Str(pos, Format.format(str.value.asString, vals.value, pos)(ev)) override def specialize(args: Array[Expr], tailstrict: Boolean): (Val.Builtin, Array[Expr]) = args match { case Array(str, fmt: Val.Str) => - try { (new Format.PartialApplyFmt(fmt.value), Array(str)) } + try { (new Format.PartialApplyFmt(fmt.str), Array(str)) } catch { case _: Exception => null } case _ => null } } private def stringChars(pos: Position, str: String): Val.Arr = { - val chars = new Array[Lazy](str.codePointCount(0, str.length)) + val chars = new Array[Eval](str.codePointCount(0, str.length)) var charIndex = 0 var i = 0 while (i < str.length) { @@ -393,10 +393,10 @@ object StringModule extends AbstractFunctionModule { builtin(DecodeUTF8), builtin(Format_), builtin("findSubstr", "pat", "str") { (pos, ev, pat: String, str: String) => - if (pat.isEmpty) Val.Arr(pos, new Array[Lazy](0)) + if (pat.isEmpty) Val.Arr(pos, new Array[Eval](0)) else { var matchIndex = str.indexOf(pat) - if (matchIndex == -1) Val.Arr(pos, new Array[Lazy](0)) + if (matchIndex == -1) Val.Arr(pos, new Array[Eval](0)) else { val indices = new mutable.ArrayBuilder.ofRef[Val.Num] @@ -426,7 +426,7 @@ object StringModule extends AbstractFunctionModule { str1.equalsIgnoreCase(str2) }, builtin("escapeStringJson", "str_") { (pos, ev, str: Val) => - if (str.force.isInstanceOf[Val.Str]) { + if (str.value.isInstanceOf[Val.Str]) { Materializer.stringify(str)(ev) } else { val out = new java.io.StringWriter() diff --git a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala index e5019047..e7561765 100644 --- a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala @@ -7,48 +7,48 @@ object TypeModule extends AbstractFunctionModule { def name = "type" private object IsString extends Val.Builtin1("isString", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Str]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Str]) } private object IsBoolean extends Val.Builtin1("isBoolean", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Bool]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Bool]) } private object IsNumber extends Val.Builtin1("isNumber", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Num]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Num]) } private object IsObject extends Val.Builtin1("isObject", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Obj]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Obj]) } private object IsArray extends Val.Builtin1("isArray", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Arr]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Arr]) } private object IsFunction extends Val.Builtin1("isFunction", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Func]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Func]) } private object IsNull extends Val.Builtin1("isNull", "v") { - def evalRhs(v: Lazy, ev: EvalScope, pos: Position): Val = - Val.bool(pos, v.force.isInstanceOf[Val.Null]) + def evalRhs(v: Eval, ev: EvalScope, pos: Position): Val = + Val.bool(pos, v.value.isInstanceOf[Val.Null]) } private object Type extends Val.Builtin1("type", "x") { - def evalRhs(x: Lazy, ev: EvalScope, pos: Position): Val = Val.Str(pos, x.force.prettyName) + def evalRhs(x: Eval, ev: EvalScope, pos: Position): Val = Val.Str(pos, x.value.prettyName) } private object AssertEqual extends Val.Builtin2("assertEqual", "a", "b") { - def evalRhs(v1: Lazy, v2: Lazy, ev: EvalScope, pos: Position): Val = { - val x1 = Materializer(v1.force)(ev) - val x2 = Materializer(v2.force)(ev) + def evalRhs(v1: Eval, v2: Eval, ev: EvalScope, pos: Position): Val = { + val x1 = Materializer(v1.value)(ev) + val x2 = Materializer(v2.value)(ev) if (x1 == x2) Val.True(pos) else Error.fail("assertEqual failed: " + x1 + " != " + x2) } @@ -68,25 +68,23 @@ object TypeModule extends AbstractFunctionModule { ev.equal(a, b) }, builtin("primitiveEquals", "x", "y") { (_, ev, x: Val, y: Val) => - val xForce = x.force - val yForce = y.force - if (xForce.prettyName != yForce.prettyName) { + if (x.prettyName != y.prettyName) { false } else { - (xForce, yForce) match { + (x, y) match { case (_: Val.Num, _: Val.Num) => - ev.compare(xForce, yForce) == 0 + ev.compare(x, y) == 0 case (_: Val.Str, _: Val.Str) => - ev.compare(xForce, yForce) == 0 + ev.compare(x, y) == 0 case (_: Val.Bool, _: Val.Bool) => - ev.compare(xForce, yForce) == 0 + ev.compare(x, y) == 0 case (_: Val.Null, _) => true case (_, _: Val.Null) => true case _ => Error.fail( - "primitiveEquals operates on primitive types, got " + xForce.prettyName + " and " + yForce.prettyName + "primitiveEquals operates on primitive types, got " + x.prettyName + " and " + y.prettyName ) } } diff --git a/sjsonnet/test/resources/test_suite/error.function_infinite_default.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.function_infinite_default.jsonnet.golden index fffa2557..31d19fea 100644 --- a/sjsonnet/test/resources/test_suite/error.function_infinite_default.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.function_infinite_default.jsonnet.golden @@ -13,1013 +13,1013 @@ Exception in thread "main" java.lang.StackOverflowError at sjsonnet.Evaluator.visitExpr(Evaluator.scala:75) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) at sjsonnet.Evaluator.visitValidId(Evaluator.scala:97) at sjsonnet.Evaluator.visitExpr(Evaluator.scala:35) at sjsonnet.Interpreter$$anon$2.evalDefault(Interpreter.scala:197) at sjsonnet.Val$Func.apply$$anonfun$2(Val.scala:545) - at sjsonnet.LazyWithComputeFunc.compute(Val.scala:33) + at sjsonnet.Lazy.compute(Val.scala:33) at sjsonnet.Lazy.force(Val.scala:21) diff --git a/sjsonnet/test/src-js/sjsonnet/BaseFileTests.scala b/sjsonnet/test/src-js/sjsonnet/BaseFileTests.scala index 49bd62cd..d8bdee13 100644 --- a/sjsonnet/test/src-js/sjsonnet/BaseFileTests.scala +++ b/sjsonnet/test/src-js/sjsonnet/BaseFileTests.scala @@ -11,12 +11,12 @@ abstract class BaseFileTests extends TestSuite { private val std = new sjsonnet.stdlib.StdLibModule( nativeFunctions = Map( "jsonToString" -> new Val.Builtin1("jsonToString", "x") { - override def evalRhs(arg1: Lazy, ev: EvalScope, pos: Position): Val = { + override def evalRhs(arg1: Eval, ev: EvalScope, pos: Position): Val = { Val.Str( pos, Materializer .apply0( - arg1.force, + arg1.value, MaterializeJsonRenderer(indent = -1, newline = "", keyValueSeparator = ":") )(ev) .toString @@ -35,8 +35,8 @@ abstract class BaseFileTests extends TestSuite { additionalStdFunctions = Map( // Scala.js does not support md5, for now, so we stub it out for the various smoke tests. "md5" -> new Val.Builtin1("md5", "s") { - override def evalRhs(arg1: Lazy, ev: EvalScope, pos: Position): Val = { - arg1.force match { + override def evalRhs(arg1: Eval, ev: EvalScope, pos: Position): Val = { + arg1.value match { case Val.Str(_, s) => s match { case "" => Val.Str(pos, "d41d8cd98f00b204e9800998ecf8427e") diff --git a/sjsonnet/test/src-jvm-native/sjsonnet/BaseFileTests.scala b/sjsonnet/test/src-jvm-native/sjsonnet/BaseFileTests.scala index 2fc6074e..6f35c3d7 100644 --- a/sjsonnet/test/src-jvm-native/sjsonnet/BaseFileTests.scala +++ b/sjsonnet/test/src-jvm-native/sjsonnet/BaseFileTests.scala @@ -11,12 +11,12 @@ abstract class BaseFileTests extends TestSuite { private val std = new sjsonnet.stdlib.StdLibModule( nativeFunctions = Map( "jsonToString" -> new Val.Builtin1("jsonToString", "x") { - override def evalRhs(arg1: Lazy, ev: EvalScope, pos: Position): Val = { + override def evalRhs(arg1: Eval, ev: EvalScope, pos: Position): Val = { Val.Str( pos, Materializer .apply0( - arg1.force, + arg1.value, MaterializeJsonRenderer(indent = -1, newline = "", keyValueSeparator = ":") )(ev) .toString diff --git a/sjsonnet/test/src/sjsonnet/CustomValTests.scala b/sjsonnet/test/src/sjsonnet/CustomValTests.scala index cf89b5c6..03d51d8c 100644 --- a/sjsonnet/test/src/sjsonnet/CustomValTests.scala +++ b/sjsonnet/test/src/sjsonnet/CustomValTests.scala @@ -15,8 +15,8 @@ object CustomValTests extends TestSuite { private final class IncreaseImportance extends Val.Builtin1("increaseImportance", "important_string") { - def evalRhs(arg1: Lazy, ev: EvalScope, pos: Position): Val = { - arg1.force match { + def evalRhs(arg1: Eval, ev: EvalScope, pos: Position): Val = { + arg1.value match { case importantString: ImportantString => importantString.copy(importance = importantString.importance + 1) case other => other