<div dir="ltr">Hi IronPython team,<div><br></div><div>Seems IronPython 2.6 has some problems with compiling coroutines that contain closures:</div><div><br></div><div>tmp.py:</div><div><div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
def coroutine():<div> x = yield 3</div><div> def inner():</div><div> print 'x=',x</div><div> inner()</div><div><br></div><div>c = coroutine()</div><div>c.next()</div><div>c.send(10)</div></blockquote>
</div><div><br></div><div>with CPython:</div><div><div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">C:\Temp>python tmp.py<div>x= 10</div><div>Traceback (most recent call last):</div>
<div> File "tmp.py", line 9, in <module></div><div> c.send(10)</div><div>StopIteration</div></blockquote></div></div><div><br></div><div><br></div><div>with IronPython 2.6:</div><div><div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
C:\Temp>ipy tmp.py<div>Traceback (most recent call last):</div><div> File "tmp.py", line 7, in tmp.py</div><div>TypeError: Unable to cast object of type 'Microsoft.Scripting.Ast.FieldExpression' to type 'Microsoft.Scripting.Ast.BlockExpression'.</div>
</blockquote></div><div><br></div><div><br></div><div>workarounds:</div><div>1) re-assign the result returned from yield to another variable</div><div><div><div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
def coroutine():<div> tmp_x = yield 3</div><div> x = tmp_x</div><div> def inner():</div><div> print 'x=',x</div><div> inner()</div></blockquote></div><div><br></div><div>2) pass the value explicitly instead of using a closure</div>
<div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">def coroutine():<div> x = yield 3</div><div> def inner(x):</div><div> print 'x=',x</div><div> inner(x)</div>
</blockquote></div><div><div><br></div><div>hope it's easy to fix</div><div><br></div><div>thanks</div><div>Ronnie</div></div></div></div></div></div></div>