On May 16, 2008, at 9:41 AM, Dag Sverre Seljebotn wrote:
> I'll create a ticket shortly containing my local branch so far. (The
> phase refactorings I've posted earlier is *not* included, this is all
> useful stuff :-) ).
>
> If anybody wants to start a process of applying it or discuss it then
> fine, but there's no hurry, if nothing happens I'll just ping the list
> again when Robert has more time available.
:)
My first impression: I always feel funny putting blocks of code
inside string literals--but this looks more sane (compared to, say
doing string substitutions!). Temps can be done by using a
ExprNodes.TempNode.
> A summary:
>
> I'll get to the main feature first so that you have a reason for
> applying this :-) It should now be possible to do stuff like:
>
> class WithTransform(VisitorTransform):
> # from with transform PEP...
> with_fragment = TreeFragment(u"""
> _mgr = (EXPR)
> _exit = mgr.__exit__
> _value = mgr.__enter__()
> _exc = True
> try:
> try:
> VAR = _value
> BLOCK
> ...
> <snip>
> ...
> """)
>
> def process_WithStatementNode(self, node):
> return self.with_fragment.substitute({
> "EXPR" : node.expr,
> "VAR" : node.var,
> "BLOCK" : node.body
> })
>
> :-)
>
> (The above is simplified, there's not always a VAR. Also it needs
> another feature before it can be completely streamlined (automatic
> "temporaries" that won't clash in the namespace; basically,
> "with_fragment.substitute(..., temps=("_mgr", ...)). When that is
> done,
> supporting the with statement is about as much work as extending the
> parser, the transform/implementation comes for free.
>
> - I've already discussed the CodeWriter. It only supports a limited
> subset (with some holes, ~30% perhaps) at this time; but it's what I
> need for now (for unit tests). I might work further on that too.
>
> - Some changes to Transform.py which I hope goes through... there's a
> Visitor object there; using the "process_ClassName" pattern (I think
> that was the conclusion for future performance reasons).
>
> - A clone_node method on Node for proper node copying (shallow object
> copy except child node lists, which are also copied).
>
> - Here's the controversial bit:
>
> In order to be able to provide proper error messages for string-based
> code snippets like the above (which are passed to Parsing.py...); I've
> changed the pointer to the source code (used as the first element
> in the
> position tuples found everywhere...) from being a string filename to
> being a SourceDescriptor object.
>
> A SourceDescriptor can currently be a FileSourceDescriptor, in which
> case things work like before (it gives the filename on __str__ so much
> code needed not change), or a StringSourceDestriptor which I use
> for my
> new code...
>
> I hope you see the advantages to this from the above code. (There are
> less intrusive ways to do this, but they would only be hacky and
> postpone the problem. Better do it properly...? BTW this pattern is
> rather common, consider for instance Source in the XML Transform
> APIs/TrAX.)
>
>
>
> --
> Dag Sverre
> _______________________________________________
> Cython-dev mailing list
> [email protected]
> http://codespeak.net/mailman/listinfo/cython-dev
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev