Hi Danilo,

The idea of decorating a function to show that the return variables could be fed back in in a scan form is interesting and could solve my problem in a nice way without new syntax.

I looked at your code but got a bit confused as to how it works (there seems to be some magic where the decorator injects the scanned variable into the namespace).  Are you able to show how you'd implement the moving average example with your package?

I tried:

@enable_scan("average")
def exponential_moving_average_pyscan(signal, decay, initial=0):
yield from ((1-decay)*(average or initial) + decay*x for x in signal)

smooth_signal_9 = list(exponential_moving_average_pyscan(signal, decay=decay))[1:]

Which almost gave the right result, but seemed to get the initial conditions wrong.

- Peter

On Sat, Apr 14, 2018 at 3:57 PM, Danilo J. S. Bellini wrote:
On 5 April 2018 at 13:52, Peter O'Connor wrote:
I was thinking it would be nice to be able to encapsulate this common type of operation into a more compact comprehension.

I propose a new "Reduce-Map" comprehension that allows us to write:
`signal = [math.sin(i*0.01) + random.normalvariate(0, 0.1) for i in range(1000)]smooth_signal = [average = (1-decay)*average + decay*x for x in signal from average=0.]`
`def exponential_moving_average(signal: Iterable[float], decay: float, initial_value: float=0.):    average = initial_value    for xt in signal:        average = (1-decay)*average + decay*xt        yield averagesignal = [math.sin(i*0.01) + random.normalvariate(0, 0.1) for i in range(1000)]smooth_signal = list(exponential_moving_average(signal, decay=0.05))`