feat: add depth, pick, roll, qdup, 2dup, 2drop, 2swap words

Co-authored-by: aider (openrouter/deepseek/deepseek-v4-pro) <aider@aider.chat>
This commit is contained in:
2026-05-03 19:40:33 +03:00
parent 5916a92a4f
commit 46e43961fd
+67
View File
@@ -722,3 +722,70 @@ void do_repeat(Word* w) {
compile_buf[while_offset_idx].num = compile_idx - while_offset_idx; compile_buf[while_offset_idx].num = compile_idx - while_offset_idx;
} }
void do_depth(Word* w) {
(void)w;
data_push(data_sp + 1);
}
void do_pick(Word* w) {
(void)w;
if (data_sp < 0) return;
int64_t idx = data_pop();
if (idx < 0 || idx > data_sp) return;
int64_t value = data_stack[data_sp - (int32_t)idx];
data_push(value);
}
void do_roll(Word* w) {
(void)w;
if (data_sp < 0) return;
int64_t n = data_pop();
if (n == 0) return;
if (n < 0 || n > data_sp) return;
int64_t i = data_stack[data_sp - (int32_t)n];
int32_t pos = (int32_t)(data_sp - (int32_t)n);
while (pos < data_sp) {
data_stack[pos] = data_stack[pos + 1];
pos++;
}
data_stack[data_sp] = i;
}
void do_qdup(Word* w) {
(void)w;
if (data_sp < 0) return;
int64_t v = data_pop();
if (v != 0) {
data_push(v);
data_push(v);
}
}
void do_2dup(Word* w) {
(void)w;
if (data_sp < 1) return;
int64_t b = data_stack[data_sp];
int64_t a = data_stack[data_sp - 1];
data_push(a);
data_push(b);
}
void do_2drop(Word* w) {
(void)w;
data_pop();
data_pop();
}
void do_2swap(Word* w) {
(void)w;
if (data_sp < 3) return;
int64_t d = data_pop(); // x4
int64_t c = data_pop(); // x3
int64_t b = data_pop(); // x2
int64_t a = data_pop(); // x1
data_push(b);
data_push(a);
data_push(d);
data_push(c);
}