<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 &#39;x=&#39;,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&gt;python tmp.py<div>x= 10</div><div>Traceback (most recent call last):</div>
<div>  File &quot;tmp.py&quot;, line 9, in &lt;module&gt;</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&gt;ipy tmp.py<div>Traceback (most recent call last):</div><div>  File &quot;tmp.py&quot;, line 7, in tmp.py</div><div>TypeError: Unable to cast object of type &#39;Microsoft.Scripting.Ast.FieldExpression&#39; to type &#39;Microsoft.Scripting.Ast.BlockExpression&#39;.</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 &#39;x=&#39;,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 &#39;x=&#39;,x</div><div>    inner(x)</div>
</blockquote></div><div><div><br></div><div>hope it&#39;s easy to fix</div><div><br></div><div>thanks</div><div>Ronnie</div></div></div></div></div></div></div>