diff --git a/cli/src/main.rs b/cli/src/main.rs index da99faf6ad..868f04b9ca 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,8 +4,7 @@ use std::fs::File; use std::io::prelude::*; use roc::expr::Expr::*; use roc::expr::Expr; -use roc::eval::eval; -use roc::eval::from_evaluated; +use roc::eval::{eval, from_evaluated}; use roc::parse; use std::io; @@ -21,10 +20,12 @@ fn main() -> std::io::Result<()> { Error(problem) => { println!("\n\u{001B}[4mruntime error\u{001B}[24m\n\n{:?}\n", problem) }, - ApplyVariant(name, payload) => { + ApplyVariant(name, Some(exprs)) => { match name.as_str() { "Echo" => { - println!("{}", payload.unwrap().first().unwrap()); + let payload = exprs.first().unwrap().clone(); + + println!("{}", payload); }, "Read" => { let mut input = String::new(); @@ -33,7 +34,7 @@ fn main() -> std::io::Result<()> { println!("[debug] You said: {}", input); }, _ => { - display_expr(ApplyVariant(name, payload)); + display_expr(ApplyVariant(name, Some(exprs))); } } }, diff --git a/cli/test.roc b/cli/test.roc index 994bac9195..2cc01ea4f5 100644 --- a/cli/test.roc +++ b/cli/test.roc @@ -28,12 +28,10 @@ after = (task, cont) -> case task when Success val then cont val when Failure val then Failure val - when Echo str, prevCont, onFailure then Echo str, ({} -> after (prevCont {}), cont), (ioErr -> after (onFailure ioErr), cont) - when Read prevCont, onFailure then Read (str -> after (prevCont str), cont), @@ -44,12 +42,10 @@ fallback = (task, onFailure) -> case task when Success val then Success val when Failure val then onFailure val - when Echo str, cont, prevOnFailure then Echo str ({} -> fallback (cont {}), onFailure), (ioErr -> fallback (prevOnFailure ioErr), onFailure) - when Read cont, prevOnFailure then Read (str -> fallback (cont str), onFailure), diff --git a/src/eval.rs b/src/eval.rs index 72920f811a..ba83d3c44a 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -128,7 +128,21 @@ pub fn scoped_eval(expr: Expr, vars: &Scope) -> Evaluated { eval_apply(func_expr, args, vars) }, - ApplyVariant(_, _) => Evaluated(expr), // This is all we do - for now... + ApplyVariant(_, None) => Evaluated(expr), // This is all we do - for now... + ApplyVariant(name, Some(exprs)) => { + Evaluated( + ApplyVariant( + name, + Some( + exprs.into_iter().map(|arg| { + let Evaluated(final_expr) = scoped_eval(arg, vars); + + final_expr + }).collect() + ) + ) + ) + } Apply(func_expr, args) => { eval_apply(scoped_eval(*func_expr, vars), args, vars)