feat: add tuple index access, multiline args, and effect unification fix
- Tuple index: `pair.0`, `pair.1` syntax across parser, typechecker, interpreter, C/JS backends, formatter, linter, and symbol table - Multi-line function args: allow newlines inside argument lists - Fix effect unification for callback parameters (empty expected effects means "no constraint", not "must be pure") Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1415,6 +1415,34 @@ impl Interpreter {
|
||||
}
|
||||
}
|
||||
|
||||
Expr::TupleIndex {
|
||||
object,
|
||||
index,
|
||||
span,
|
||||
} => {
|
||||
let obj_val = self.eval_expr(object, env)?;
|
||||
match obj_val {
|
||||
Value::Tuple(elements) => {
|
||||
if *index < elements.len() {
|
||||
Ok(EvalResult::Value(elements[*index].clone()))
|
||||
} else {
|
||||
Err(RuntimeError {
|
||||
message: format!(
|
||||
"Tuple index {} out of bounds for tuple with {} elements",
|
||||
index,
|
||||
elements.len()
|
||||
),
|
||||
span: Some(*span),
|
||||
})
|
||||
}
|
||||
}
|
||||
_ => Err(RuntimeError {
|
||||
message: format!("Cannot use tuple index on {}", obj_val.type_name()),
|
||||
span: Some(*span),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
Expr::Lambda { params, body, .. } => {
|
||||
let closure = Closure {
|
||||
params: params.iter().map(|p| p.name.name.clone()).collect(),
|
||||
|
||||
Reference in New Issue
Block a user