first draft of list splatterns
This commit is contained in:
parent
2b95094eca
commit
a4d68fa02e
|
@ -783,7 +783,7 @@ impl<'a> Compiler<'a> {
|
||||||
}
|
}
|
||||||
ListPattern(members) => {
|
ListPattern(members) => {
|
||||||
let mut is_splatted = false;
|
let mut is_splatted = false;
|
||||||
if let Some((Splattern(patt), _)) = members.last() {
|
if let Some((Splattern(_), _)) = members.last() {
|
||||||
is_splatted = true;
|
is_splatted = true;
|
||||||
self.emit_op(Op::MatchSplattedList)
|
self.emit_op(Op::MatchSplattedList)
|
||||||
} else {
|
} else {
|
||||||
|
@ -799,6 +799,7 @@ impl<'a> Compiler<'a> {
|
||||||
|
|
||||||
if is_splatted {
|
if is_splatted {
|
||||||
self.emit_op(Op::LoadSplattedList);
|
self.emit_op(Op::LoadSplattedList);
|
||||||
|
self.emit_byte(members.len());
|
||||||
} else {
|
} else {
|
||||||
self.emit_op(Op::LoadList);
|
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(before_load_dict_idx, self.len() - before_load_dict_idx - 3);
|
||||||
self.patch_jump(jump_idx, self.len() - jump_idx - 3);
|
self.patch_jump(jump_idx, self.len() - jump_idx - 3);
|
||||||
}
|
}
|
||||||
Splattern(..) => {
|
Splattern(patt) => {
|
||||||
todo!()
|
self.visit(patt);
|
||||||
}
|
}
|
||||||
InterpolatedPattern(parts, _) => {
|
InterpolatedPattern(parts, _) => {
|
||||||
println!("An interpolated pattern of {} parts", parts.len());
|
println!("An interpolated pattern of {} parts", parts.len());
|
||||||
|
|
|
@ -75,7 +75,8 @@ pub fn run(src: &'static str) {
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
env::set_var("RUST_BACKTRACE", "1");
|
env::set_var("RUST_BACKTRACE", "1");
|
||||||
let src = "
|
let src = "
|
||||||
let [] = []
|
let [x, ...y] = [1, 2, 3, 4, 5]
|
||||||
|
y
|
||||||
";
|
";
|
||||||
run(src);
|
run(src);
|
||||||
}
|
}
|
||||||
|
|
14
src/vm.rs
14
src/vm.rs
|
@ -458,16 +458,23 @@ impl Vm {
|
||||||
}
|
}
|
||||||
MatchList => {
|
MatchList => {
|
||||||
let idx = self.stack.len() - self.match_depth as usize - 1;
|
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();
|
let scrutinee = self.stack[idx].clone();
|
||||||
match scrutinee {
|
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.matches = false,
|
||||||
};
|
};
|
||||||
self.ip += 2;
|
self.ip += 2;
|
||||||
}
|
}
|
||||||
MatchSplattedList => {
|
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 => {
|
LoadList => {
|
||||||
let idx = self.stack.len() - self.match_depth as usize - 1;
|
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)));
|
let splatted = Value::List(Box::new(members.skip(loaded_len - 1)));
|
||||||
self.push(splatted);
|
self.push(splatted);
|
||||||
self.ip += 2;
|
self.ip += 2;
|
||||||
todo!()
|
|
||||||
}
|
}
|
||||||
// PushDict => {
|
// PushDict => {
|
||||||
// let dict_len = self.chunk().bytecode[self.ip + 1] as usize * 2;
|
// let dict_len = self.chunk().bytecode[self.ip + 1] as usize * 2;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user