Add double-stack words (2dup, 2drop, 2swap, 2over) and forget
Some checks failed
Deploy Website / deploy (push) Failing after 4m49s
Some checks failed
Deploy Website / deploy (push) Failing after 4m49s
This commit is contained in:
@@ -262,6 +262,42 @@ impl Forth {
|
||||
let v = stack[len - 1].clone();
|
||||
stack.insert(len - 2, v);
|
||||
}
|
||||
Op::Dup2 => {
|
||||
let len = stack.len();
|
||||
if len < 2 {
|
||||
return Err("stack underflow".into());
|
||||
}
|
||||
let a = stack[len - 2].clone();
|
||||
let b = stack[len - 1].clone();
|
||||
stack.push(a);
|
||||
stack.push(b);
|
||||
}
|
||||
Op::Drop2 => {
|
||||
let len = stack.len();
|
||||
if len < 2 {
|
||||
return Err("stack underflow".into());
|
||||
}
|
||||
stack.pop();
|
||||
stack.pop();
|
||||
}
|
||||
Op::Swap2 => {
|
||||
let len = stack.len();
|
||||
if len < 4 {
|
||||
return Err("stack underflow".into());
|
||||
}
|
||||
stack.swap(len - 4, len - 2);
|
||||
stack.swap(len - 3, len - 1);
|
||||
}
|
||||
Op::Over2 => {
|
||||
let len = stack.len();
|
||||
if len < 4 {
|
||||
return Err("stack underflow".into());
|
||||
}
|
||||
let a = stack[len - 4].clone();
|
||||
let b = stack[len - 3].clone();
|
||||
stack.push(a);
|
||||
stack.push(b);
|
||||
}
|
||||
|
||||
Op::Add => binary_op(stack, |a, b| a + b)?,
|
||||
Op::Sub => binary_op(stack, |a, b| a - b)?,
|
||||
@@ -915,6 +951,10 @@ impl Forth {
|
||||
.unwrap_or(0);
|
||||
stack.push(Value::Int(val as i64, None));
|
||||
}
|
||||
Op::Forget => {
|
||||
let name = stack.pop().ok_or("stack underflow")?.as_str()?.to_string();
|
||||
self.dict.lock().unwrap().remove(&name);
|
||||
}
|
||||
}
|
||||
pc += 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user