]> code.bitgloo.com Git - clyne/foci.git/commitdiff
return stack words
authorClyne Sullivan <clyne@bitgloo.com>
Tue, 28 Jan 2025 02:44:35 +0000 (21:44 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Tue, 28 Jan 2025 02:44:35 +0000 (21:44 -0500)
README.md
foci.c

index ca0d89ef6c666c7db6a7890453f34f30f9363148..721d29f3f81fbd95f2cdce0549698d90a5ed5dcd 100644 (file)
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ Register usage is the only platform-specific requirement; otherwise, `foci` is w
 dup drop swap rot -rot over tuck @ ! c@ c! + +! - * / mod and or xor = < [ ] ,
 cell cell+ cells base here allot latest negate invert 1- 1+ aligned align : ;
 literal if then else ' ['] execute decimal hex . emit begin until again while
-repeat
+repeat >r r> 2>r 2r>
 ```
 
 ## Build instructions
diff --git a/foci.c b/foci.c
index e896015b94ebe16741df280489b0ba9a72c0a337..77b4b674aafeb1fb90c7913f462eb7441eca8479 100644 (file)
--- a/foci.c
+++ b/foci.c
@@ -158,7 +158,13 @@ I(until,  "until",  &w_begin)   LIT(bz), comma, comma, END
 I(again,  "again",  &w_until)   LIT(b), comma, comma, END
 I(fwhile, "while",  &w_again)   FTH(fif), END
 I(repeat, "repeat", &w_fwhile)  swap, FTH(again), FTH(then), END
-#define LATEST_INIT &w_repeat
+N(pushr,  ">r",     &w_repeat)  { *--rp = (intptr_t **)*sp++; NEXT; }
+N(popr,   "r>",     &w_pushr)   { *--sp = (intptr_t)*rp++; NEXT; }
+N(pushr2, "2>r",    &w_popr)    { *--rp = (intptr_t **)sp[1];
+                                  *--rp = (intptr_t **)sp[0]; sp += 2; NEXT; }
+N(popr2,  "2r>",    &w_pushr2)  { *--sp = (intptr_t)rp[1];
+                                  *--sp = (intptr_t)rp[0]; rp += 2; NEXT; }
+#define LATEST_INIT &w_popr2
 
 void enter_forth(const void * const ptr)
 {