forth: add word "UNTIL"

This commit is contained in:
Virgil Dupras 2020-03-18 16:39:22 -04:00
parent 1df9c4fc1b
commit 587d1d0d69
2 changed files with 5 additions and 3 deletions

View File

@ -3,11 +3,12 @@
: +! SWAP OVER @ + SWAP ! ; : +! SWAP OVER @ + SWAP ! ;
: ALLOT HERE +! ; : ALLOT HERE +! ;
: C, H C! 1 ALLOT ; : C, H C! 1 ALLOT ;
: BEGIN H ; IMMEDIATE
: COMPILE ' ['] LITN EXECUTE ['] , , ; IMMEDIATE : COMPILE ' ['] LITN EXECUTE ['] , , ; IMMEDIATE
: BEGIN H ; IMMEDIATE
: AGAIN COMPILE (bbr) H -^ C, ; IMMEDIATE : AGAIN COMPILE (bbr) H -^ C, ; IMMEDIATE
: UNTIL COMPILE SKIP? COMPILE (bbr) H -^ C, ; IMMEDIATE
: NOT 1 SWAP SKIP? EXIT 0 * ; : NOT 1 SWAP SKIP? EXIT 0 * ;
: ( BEGIN LITS ) WORD SCMP NOT SKIP? AGAIN ; IMMEDIATE : ( BEGIN LITS ) WORD SCMP NOT UNTIL ; IMMEDIATE
( Hello, hello, krkrkrkr... do you hear me? ( Hello, hello, krkrkrkr... do you hear me?
Ah, voice at last! Some lines above need comments Ah, voice at last! Some lines above need comments
BTW: Forth lines limited to 64 cols because of default BTW: Forth lines limited to 64 cols because of default
@ -17,7 +18,7 @@
(bbr)) and then call LITN on it. However, LITN is an (bbr)) and then call LITN on it. However, LITN is an
immediate and has to be indirectly executed. Then, write immediate and has to be indirectly executed. Then, write
a reference to "," so that this word is written to HERE. a reference to "," so that this word is written to HERE.
NOT: a bit convulted because we don't have IF yet ) NOT: a bit convulted because we don't have IF yet )
: IF ( -- a | a: br cell addr ) : IF ( -- a | a: br cell addr )

View File

@ -91,6 +91,7 @@ SKIP? f -- If f is true, skip the execution of the next atom.
Use this right before ";" and you're gonna have a Use this right before ";" and you're gonna have a
bad time. bad time.
THEN I:a -- *I* Set branching cell at a. THEN I:a -- *I* Set branching cell at a.
UNTIL f -- *I* Jump backwards to BEGIN if f is *false*.
*** Parameter Stack *** *** Parameter Stack ***
DROP a -- DROP a --