diff --git a/examples/playground.sb b/examples/playground.sb index 998f24e..8cef15b 100644 --- a/examples/playground.sb +++ b/examples/playground.sb @@ -4,7 +4,8 @@ main :: () { fib :: (n) { if n { - return n + let x = 1 + n + return x } return 1 diff --git a/src/generator/js.rs b/src/generator/js.rs index 927f910..83a6c5a 100644 --- a/src/generator/js.rs +++ b/src/generator/js.rs @@ -41,7 +41,7 @@ fn generate_function(func: Function) -> String { fn generate_statement(statement: Statement) -> String { match statement { Statement::Return(ret) => generate_return(ret), - Statement::Declare(_, _) => todo!(), + Statement::Declare(name, val) => generate_declare(name.name, val), Statement::Exp(val) => generate_expression(val), Statement::If(expr, if_state, else_state) => { generate_conditional(expr, if_state, else_state.map(|x| *x)) @@ -78,6 +78,15 @@ fn generate_conditional( outcome } +fn generate_declare(name: String, val: Option) -> String { + // var is used here to not collide with scopes. + // TODO: Can let be used instead? + match val { + Some(expr) => format!("var {} = {};", name, generate_expression(expr)), + None => format!("var {};", name), + } +} + fn generate_function_call(func: String, args: Vec) -> String { let formatted_args = args .into_iter()