George Sakkis <[EMAIL PROTECTED]> writes:

> On May 31, 4:19 am, Arnaud Delobelle <[EMAIL PROTECTED]> wrote:
>> Cameron <[EMAIL PROTECTED]> writes:
>> > I was reading this <a href="thishttp://www.paulgraham.com/icad.html";>Paul
>> > Graham article</a> and he builds an accumuator generator function in
>> > the appendix. His looks like this:
>>
>> > <pre>
>> > def foo(n):
>> >   s = [n]
>> >   def bar(i):
>> >     s[0] += i
>> >     return s[0]
>> >   return bar
>> > </pre>
>>
>> > Why does that work, but not this:
>>
>> > <pre>
>> > def foo(n):
>> >   s = n
>> >   def bar(i):
>> >     s += i
>> >     return s
>> >   return bar
>> > </pre>
>>
>> Others have explained why, but this looks like "pythonized LISP" to
>> me.  I would rather use a generator function:
>>
>> def foo(n):
>>     while True:
>>         n += yield n
>>
>> Although the problem is that you can't send it values the first time
>> round!
>>
>> >>> bar = foo('s')
>> >>> bar.next()
>> 's'
>> >>> bar.send('p')
>> 'sp'
>> >>> bar.send('am')
>>
>> 'spam'
>>
>> But:
>>
>> >>> bar = foo(3)
>> >>> bar.send(2)
>>
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: can't send non-None value to a just-started generator
>
> I find the "pythonized LISP" solution more understandable, even
> without the initial next() requirement. YMMV
>
> George

In that case a class may be better?  IMHO, what is such a natural
idiom in LISP does not translate well literally into Python.

class Foo(object):
    def __init__(self, n):
        self.s = n
    def __call__(self, i)
       self.s += i
       return self.s
 
Anything to avoid the mutable container trick!  Of course 'nonlocal'
takes care of this in py3k.  I have missed the absence of 'nonlocal' a
lot, but now that it is around the corner, I grow less sure about it.

-- 
Arnaud
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to