diff --git a/cmds/jrsonnet/Cargo.toml b/cmds/jrsonnet/Cargo.toml index cdf89637..ef0355b1 100644 --- a/cmds/jrsonnet/Cargo.toml +++ b/cmds/jrsonnet/Cargo.toml @@ -15,6 +15,7 @@ experimental = [ "exp-object-iteration", "exp-bigint", "exp-apply", + "exp-regex", ] # Use mimalloc as allocator mimalloc = ["mimallocator"] diff --git a/crates/jrsonnet-evaluator/src/evaluate/mod.rs b/crates/jrsonnet-evaluator/src/evaluate/mod.rs index 127f287c..d9c53db0 100644 --- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs +++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs @@ -596,10 +596,24 @@ pub fn evaluate(ctx: Context, expr: &LocExpr) -> Result { ArrComp(expr, comp_specs) => { let mut out = Vec::new(); evaluate_comp(ctx, comp_specs, &mut |ctx| { - out.push(evaluate(ctx, expr)?); + #[derive(Trace)] + struct EvaluateThunk { + ctx: Context, + expr: LocExpr, + } + impl ThunkValue for EvaluateThunk { + type Output = Val; + fn get(self: Box) -> Result { + evaluate(self.ctx, &self.expr) + } + } + out.push(Thunk::new(EvaluateThunk { + ctx, + expr: expr.clone(), + })); Ok(()) })?; - Val::Arr(ArrValue::eager(out)) + Val::Arr(ArrValue::lazy(out)) } Obj(body) => Val::Obj(evaluate_object(ctx, body)?), ObjExtend(a, b) => evaluate_add_op(