first draft of list splatterns

This commit is contained in:
Scott Richmond 2025-06-19 12:18:09 -04:00
parent 2b95094eca
commit a4d68fa02e
3 changed files with 16 additions and 8 deletions

View File

@ -783,7 +783,7 @@ impl<'a> Compiler<'a> {
}
ListPattern(members) => {
let mut is_splatted = false;
if let Some((Splattern(patt), _)) = members.last() {
if let Some((Splattern(_), _)) = members.last() {
is_splatted = true;
self.emit_op(Op::MatchSplattedList)
} else {
@ -799,6 +799,7 @@ impl<'a> Compiler<'a> {
if is_splatted {
self.emit_op(Op::LoadSplattedList);
self.emit_byte(members.len());
} else {
self.emit_op(Op::LoadList);
}
@ -856,8 +857,8 @@ impl<'a> Compiler<'a> {
self.patch_jump(before_load_dict_idx, self.len() - before_load_dict_idx - 3);
self.patch_jump(jump_idx, self.len() - jump_idx - 3);
}
Splattern(..) => {
todo!()
Splattern(patt) => {
self.visit(patt);
}
InterpolatedPattern(parts, _) => {
println!("An interpolated pattern of {} parts", parts.len());

View File

@ -75,7 +75,8 @@ pub fn run(src: &'static str) {
pub fn main() {
env::set_var("RUST_BACKTRACE", "1");
let src = "
let [] = []
let [x, ...y] = [1, 2, 3, 4, 5]
y
";
run(src);
}

View File

@ -458,16 +458,23 @@ impl Vm {
}
MatchList => {
let idx = self.stack.len() - self.match_depth as usize - 1;
let tuple_len = self.chunk().bytecode[self.ip + 1];
let list_len = self.chunk().bytecode[self.ip + 1];
let scrutinee = self.stack[idx].clone();
match scrutinee {
Value::List(members) => self.matches = members.len() == tuple_len as usize,
Value::List(members) => self.matches = members.len() == list_len as usize,
_ => self.matches = false,
};
self.ip += 2;
}
MatchSplattedList => {
todo!()
let idx = self.stack.len() - self.match_depth as usize - 1;
let patt_len = self.chunk().bytecode[self.ip + 1];
let scrutinee = self.stack[idx].clone();
match scrutinee {
Value::List(members) => self.matches = members.len() >= patt_len as usize,
_ => self.matches = false,
}
self.ip += 2;
}
LoadList => {
let idx = self.stack.len() - self.match_depth as usize - 1;
@ -495,7 +502,6 @@ impl Vm {
let splatted = Value::List(Box::new(members.skip(loaded_len - 1)));
self.push(splatted);
self.ip += 2;
todo!()
}
// PushDict => {
// let dict_len = self.chunk().bytecode[self.ip + 1] as usize * 2;