Is the "for" form a macro? And if so how difficult would it be to make a new form "for-with-look-around" that had built in look-back and look-ahead operators (next x) (prior x) ( next?) (prior?).
So you could do something like: ((define (running-average-of-3 l) (for-with-look-around ([x (in-list l)]) (unless? (or (prior?) (next?)) (displayln (/ (+ x (prior x) (next x)) 3)))))) From a functional programming perspective is building a form like this a bad idea? Thanks, Harry On Sun, May 27, 2012 at 4:32 AM, Jens Axel Søgaard <jensa...@soegaard.net> wrote: > 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.sp...@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 >> <matth...@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 ____________________ Racket Users list: http://lists.racket-lang.org/users