diff --git a/doc/RETRO-Book.md b/doc/RETRO-Book.md index 07d18d6..e202218 100644 --- a/doc/RETRO-Book.md +++ b/doc/RETRO-Book.md @@ -2460,6 +2460,15 @@ one of these, use `0;`, `-if;` or `if;`. :test #100 repeat dup #50 eq? [ 'done! s:put nl ] if; n:dec again ; test +You can also achieve this via recursion: + + :test 0; dup n:put sp n:dec test ; + #100 test + +Be careful with recursion as the virtual machine will have a limited +amount of space for the address stack and recursing too many times +can cause a stack overflow. + ## Counted Loops There are two combinators for counted loops. These are `times` and @@ -2478,6 +2487,14 @@ The loop indexes can be accessed outside the loop body: :squares [ display ] times nl ; #100 squares +## Tradeoffs + +The unconditional loop form is more efficient as it's just a +simple jump operation. The `times` counted loops are a little +slower, but can be cleaner and more readable in many cases. The +`times` form is significantly slower than the other +two forms. + # Working With Numbers Numbers in RETRO are signed integers. diff --git a/doc/book/techniques/loops b/doc/book/techniques/loops index 1c92434..9cb9396 100644 --- a/doc/book/techniques/loops +++ b/doc/book/techniques/loops @@ -18,6 +18,15 @@ one of these, use `0;`, `-if;` or `if;`. :test #100 repeat dup #50 eq? [ 'done! s:put nl ] if; n:dec again ; test +You can also achieve this via recursion: + + :test 0; dup n:put sp n:dec test ; + #100 test + +Be careful with recursion as the virtual machine will have a limited +amount of space for the address stack and recursing too many times +can cause a stack overflow. + ## Counted Loops There are two combinators for counted loops. These are `times` and @@ -35,3 +44,11 @@ The loop indexes can be accessed outside the loop body: :display I n:square n:put sp ; :squares [ display ] times nl ; #100 squares + +## Tradeoffs + +The unconditional loop form is more efficient as it's just a +simple jump operation. The `times` counted loops are a little +slower, but can be cleaner and more readable in many cases. The +`times` form is significantly slower than the other +two forms.