While I see the apparent declarative nature of the (next .) and (prior .) notation, I am afraid that you would next expect (next (next (next (next (next x)))))) to work too. And that would be bad. -- Matthias
On May 27, 2012, at 9:30 AM, Harry Spier wrote: > 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 ____________________ Racket Users list: http://lists.racket-lang.org/users