Condense DO LOOP.

This commit is contained in:
Brad Nelson
2022-07-30 16:49:11 -07:00
parent 1e6aeacbe3
commit f0a1d54b35
3 changed files with 17 additions and 10 deletions

View File

@ -63,15 +63,18 @@ variable leaving
begin dup while dup @ swap here swap ! repeat drop ; begin dup while dup @ swap here swap ! repeat drop ;
: (do) ( n n -- .. ) swap r> -rot >r >r >r ; : (do) ( n n -- .. ) swap r> -rot >r >r >r ;
: do ( lim s -- ) leaving( postpone (do) here ; immediate : do ( lim s -- ) leaving( postpone (do) here ; immediate
: (?do) ( n n -- n n f .. ) 2dup = if 2drop 0 else -1 then ; : (?do) ( n n -- n n f .. )
: ?do ( lim s -- ) leaving( postpone (?do) postpone 0branch leaving, 2dup = if 2drop r> @ >r else swap r> cell+ -rot >r >r >r then ;
postpone (do) here ; immediate : ?do ( lim s -- ) leaving( postpone (?do) leaving, here ; immediate
: unloop postpone rdrop postpone rdrop ; immediate : unloop r> rdrop rdrop >r ;
: leave postpone unloop postpone branch leaving, ; immediate : (leave) r> rdrop rdrop @ >r ;
: (+loop) ( n -- f .. ) dup 0< swap r> r> rot + dup r@ < -rot >r >r xor 0= ; : leave postpone (leave) leaving, ; immediate
: +loop ( n -- ) postpone (+loop) postpone until : (+loop) ( n -- ) dup 0< swap r> r> rot + dup r@ < -rot >r >r xor 0=
postpone unloop )leaving ; immediate if r> cell+ rdrop rdrop >r else r> @ >r then ;
: loop 1 aliteral postpone +loop ; immediate : +loop ( n -- ) postpone (+loop) , )leaving ; immediate
: (loop) r> r> 1+ dup r@ < -rot >r >r 0=
if r> cell+ rdrop rdrop >r else r> @ >r then ;
: loop postpone (loop) , )leaving ; immediate
create I ' r@ @ ' i ! ( i is same as r@ ) create I ' r@ @ ' i ! ( i is same as r@ )
: J ( -- n ) rp@ 3 cells - @ ; : J ( -- n ) rp@ 3 cells - @ ;
: K ( -- n ) rp@ 5 cells - @ ; : K ( -- n ) rp@ 5 cells - @ ;

View File

@ -90,6 +90,10 @@ variable indent
dup @ ['] BRANCH @ = dup @ ['] BRANCH @ =
over @ ['] 0BRANCH @ = or over @ ['] 0BRANCH @ = or
over @ ['] DONEXT @ = or over @ ['] DONEXT @ = or
over ['] (?do) = or
over ['] (+loop) = or
over ['] (loop) = or
over ['] (leave) = or
if swap cell+ swap then if swap cell+ swap then
drop drop
; ;

View File

@ -57,7 +57,7 @@ transfer{
immediate? input-buffer ?echo ?arrow. arrow immediate? input-buffer ?echo ?arrow. arrow
evaluate-buffer aliteral value-bind evaluate-buffer aliteral value-bind
leaving( )leaving leaving leaving, leaving( )leaving leaving leaving,
(do) (?do) (+loop) (do) (?do) (+loop) (loop) (leave)
parse-quote digit $@ raw.s parse-quote digit $@ raw.s
tib-setup input-limit tib-setup input-limit
[SKIP] [SKIP]' raw-ok boot-prompt free. [SKIP] [SKIP]' raw-ok boot-prompt free.