From caf73c36f2456b4d08e6319b88b83891cb59e03e Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Mon, 20 Dec 2021 17:58:09 +1100 Subject: [PATCH] Finish adding support for optional params (#530) --- crates/nu-engine/src/eval.rs | 22 ++++++++++++++-------- src/tests.rs | 8 ++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index 9498bb299b..2c08151b4f 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -39,18 +39,24 @@ fn eval_call( let block = engine_state.get_block(block_id); let mut stack = stack.collect_captures(&block.captures); - for (arg, param) in call.positional.iter().zip( - decl.signature() - .required_positional - .iter() - .chain(decl.signature().optional_positional.iter()), - ) { - let result = eval_expression(engine_state, &mut stack, arg)?; + + for (param_idx, param) in decl + .signature() + .required_positional + .iter() + .chain(decl.signature().optional_positional.iter()) + .enumerate() + { let var_id = param .var_id .expect("internal error: all custom parameters must have var_ids"); - stack.add_var(var_id, result); + if let Some(arg) = call.positional.get(param_idx) { + let result = eval_expression(engine_state, &mut stack, arg)?; + stack.add_var(var_id, result); + } else { + stack.add_var(var_id, Value::nothing(call.head)); + } } if let Some(rest_positional) = decl.signature().rest_positional { diff --git a/src/tests.rs b/src/tests.rs index bb2f28bae8..61f2fdfac0 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1300,3 +1300,11 @@ fn get_table_columns_1() -> TestResult { fn get_table_columns_2() -> TestResult { run_test("[[name, age, grade]; [paul,21,a]] | columns | nth 1", "age") } + +#[test] +fn allow_missing_optional_params() -> TestResult { + run_test( + "def foo [x?:int] { if $x != $nothing { $x + 10 } else { 5 } }; foo", + "5", + ) +}