[racket] Looping with look-behind and look-forward

From: Jens Axel Søgaard (jensaxel at soegaard.net)
Date: Sun May 27 04:32:54 EDT 2012

It suddenly dawned on me, that the append trick is
not needed. This works too:

(define (running-average-of-3-alternative l)
 (for ([x (in-list l)]
         [y (in-list (cdr l))]
         [z (in-list (cddr l))])
   (displayln (/ (+ x y z) 3))))

But in this version, the list is traversed 3 times.
In the fold version it is only traversed once.

/Jens Axel


2012/5/27 Harry Spier <vasishtha.spier at gmail.com>:
> Thank you Matthias for the pattern, its exactly what I needed.
> And thank you Jens for the trick of appending a dummy element to the
> list so you don't lose the last item in the list.
> I.e.
> (define (f1 lst)
>  (define-values (result-list dummy1 dummy2)
> (for/fold ([result-list '()][prior '()] [current (first lst)])
>  [next (rest (append lst '()))]
>  ....
>  ...
>  (values (cons result-item result-list )
>          current
>          next))) (reverse result-list))
>
> On Sat, May 26, 2012 at 11:50 AM, Matthias Felleisen
> <matthias at ccs.neu.edu> wrote:
>>
>> Do you mean that if you operated on a list it would look like this:
>>
>> #lang racket
>>
>> (define (running-average-of-3 l2)
>>  (define-values (_1 _2)
>>    (for/fold ((current (second l2)) (prior (first l2))) ((next (rest (rest l2))))
>>      (displayln (/ (+ prior current next)))
>>      (values next current)))
>>  (void))
>>
>> (running-average-of-3 '(1 2 3 4 5 6 7 8 9 0))
>>
>>
>>
>>
>> On May 26, 2012, at 12:56 AM, Harry Spier wrote:
>>
>>> I can use for/fold to loop through a sequence while having the current
>>> element and  the previous element of the sequence still available by
>>> doing something like this.
>>>
>>> (for/fold ([previous-element-in-sequence '()][list-being-created '()])
>>>  ( [current-element-in-sequence sequence])
>>>  (do some stuff)
>>>  ....
>>>  (values current-element-in-sequence
>>>          (cons something list-being-created)))
>>>
>>> But what I want is to be able to loop through a sequence while having
>>> the prior, the current and the next element available.
>>>
>>> I'm sequencing through a representation of lines of a black and white
>>> page of text showing where the black pixels are and from that
>>> producing a graph showing the connectivity of the black pixel strips
>>> on each line to the ones on the lines above and below it.
>>>
>>> Using for/fold I'm able to code the graph of connectedness of the
>>> black strips on each line to the prior line in a very straightforward
>>> way, but I'd like to graph in both directions both to the prior line
>>> and to the next line at the same time.
>>>
>>> Is there a simple way to loop through a sequence and have the prior,
>>> current and next element available at the same time.
>>>
>>> Thanks,
>>> Harry
>>> ____________________
>>>  Racket Users list:
>>>  http://lists.racket-lang.org/users
>>



-- 
--
Jens Axel Søgaard


Posted on the users mailing list.