[racket] Looping with look-behind and look-forward
2012/5/27 Harry Spier <vasishtha.spier at gmail.com>:
> 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?
It is a fine idea.
Here is variation on the idea.
(define (in-triples l)
(define (sublists xs)
(if (empty? xs)
'()
(cons xs (sublists (rest xs)))))
(define (triple xs) (take xs 3))
(sequence-map triple (drop-right (sublists l) 2)))
(define (running-average-of-3 l)
(for ([t (in-triples l)])
(match-define (list x y z) t)
(displayln (/ (+ x y z) 3))))
(running-average-of-3 '(1 2 3 4 5 6))