This commit is contained in:
JT
2021-10-26 09:04:23 +13:00
parent f84582ca2b
commit d29208dd9e
14 changed files with 265 additions and 81 deletions

View File

@ -40,7 +40,7 @@ impl Command for Do {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
let params: Vec<_> = block
.signature

View File

@ -51,22 +51,22 @@ impl Command for For {
.expect("internal error: missing keyword");
let values = eval_expression(engine_state, stack, keyword_expr)?;
let block = call.positional[2]
let block_id = call.positional[2]
.as_block()
.expect("internal error: expected block");
let engine_state = engine_state.clone();
let stack = stack.enter_scope();
let block = engine_state.get_block(block_id);
let mut stack = stack.collect_captures(&block.captures);
match values {
Value::List { vals, span } => Ok(vals
.into_iter()
.map(move |x| {
let block = engine_state.get_block(block);
let mut stack = stack.clone();
stack.add_var(var_id, x);
let block = engine_state.get_block(block_id);
match eval_block(&engine_state, &mut stack, block, PipelineData::new()) {
Ok(value) => Value::List {
vals: value.collect(),
@ -79,12 +79,9 @@ impl Command for For {
Value::Range { val, span } => Ok(val
.into_range_iter()?
.map(move |x| {
let block = engine_state.get_block(block);
let mut stack = stack.enter_scope();
stack.add_var(var_id, x);
let block = engine_state.get_block(block_id);
match eval_block(&engine_state, &mut stack, block, PipelineData::new()) {
Ok(value) => Value::List {
vals: value.collect(),
@ -95,10 +92,6 @@ impl Command for For {
})
.into_pipeline_data()),
x => {
let block = engine_state.get_block(block);
let mut stack = stack.enter_scope();
stack.add_var(var_id, x);
eval_block(&engine_state, &mut stack, block, PipelineData::new())

View File

@ -44,13 +44,13 @@ impl Command for If {
Value::Bool { val, .. } => {
if val {
let block = engine_state.get_block(then_block);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
eval_block(engine_state, &mut stack, block, input)
} else if let Some(else_case) = else_case {
if let Some(else_expr) = else_case.as_keyword() {
if let Some(block_id) = else_expr.as_block() {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
eval_block(engine_state, &mut stack, block, input)
} else {
eval_expression(engine_state, stack, else_expr)