[plt-scheme] looping?
On Mon, 5 Jun 2006, Mike wrote:
> I know there is intended a lot of recursion for scheme, but is there
> looping? The REPL construct isn't recursive (my guess). How do you loop?
Hi Mike,
I'm not quite sure I understand why the REPL being recursive or not would
matter. Could you explain more?
In any case, here's an example of a "loop":
;;;;;;;;;;;;;;;;;;;;;;
(let loop ([i 0])
(when (< i 10)
(printf "~a~n" i)
(loop (add1 i))))
;;;;;;;;;;;;;;;;;;;;;;
This uses a "named" loop that allows us to write a simple recursive
function. Here, loop starts off with zero, and we increment till we hit
10.
If we find that we use this kind of construction a lot, we can
capture this pattern as a function:
;;;;;;;;;;;;;;;;;;;;;;;;;;
> (define (repeat f n)
(let loop ([i 0])
(when (< i n)
(f i)
(loop (add1 i)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;
Once we have this, we can write "loops" that don't look like they're using
recursion.
;;;;;;;;;;;;;;;;;;;;;;;;;;
> (define (print-number x)
(printf "~a~n" x))
>
> (repeat print-number 10)
0
1
2
3
4
5
6
7
8
9
;;;;;;;;;;;;;;;;;;;;;;;;;;
Generally, though, structures will often already define some convenient
functions for doing an operation on every element in that structure. For
example, if we need to transform every element in a list of things, we can
use a *map*:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> (define (square x) (* x x))
>
> (map square (list 3 1 4 1 5 9 2 6))
(9 1 16 1 25 81 4 36)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
The cookbook recipe on "Looping Constructs" should be helpful:
http://schemecookbook.org/view/Cookbook/IdiomLoopingConstructs
Best of wishes!