[IronPython] InteractiveCode and function definitions

Michael Foord fuzzyman at voidspace.org.uk
Thu Apr 16 20:01:48 CEST 2009


Curt Hagenlocher wrote:
> What I've done is to test explicitly for the blank line at the end in 
> conjuction with the test for ScriptCodeParseResult.IncompleteStatement:
>  
> completeThought = (result == ScriptCodeParseResult.Complete or
>     result == ScriptCodeParseResult.Invalid or
>     (result == ScriptCodeParseResult.IncompleteStatement and 
> text.endswith('\n\n')))

Thanks guys - I've got a working implementation that seems to handle all 
the cases we need. Nice one.

Michael
>
> On Thu, Apr 16, 2009 at 10:54 AM, Michael Foord 
> <fuzzyman at voidspace.org.uk <mailto:fuzzyman at voidspace.org.uk>> wrote:
>
>     Curt Hagenlocher wrote:
>
>         That's only because you've decided to arbitrarily[*] define
>         "\n\n" as being a signal to mean "complete".  That's not part
>         of the actual language specification.
>
>     It's the behaviour of the interactive interpreter though - which
>     specifies something. It's also the specification adhered to by the
>     code module for implementing interactive interpreters.
>
>
>         In fact, if I append "\n\n  print 2\n\n" to that string, it's
>         still a valid Python program.  The key here is that "the user
>         has entered a complete thought" is a property of the
>         interpreter and not of the language.  I might well decide that
>         the "commit" key sequence is Control+E (as it is in SQL Server
>         Management Studio) instead of "enter enter".
>          My point is that it's not correct for IronPython to dictate
>         the semantics of your interpreter.
>
>
>     Fine, so do you have any suggestions as to how to replicate the
>     behaviour of the interactive interpreter - whether or not it
>     counts as a specification?
>
>     Michael
>
>          [*] Okay, "arbitrary" is a bit strong in that it's what
>         python.exe and ipy.exe defines. :)
>
>         On Thu, Apr 16, 2009 at 10:36 AM, Michael Foord
>         <fuzzyman at voidspace.org.uk <mailto:fuzzyman at voidspace.org.uk>
>         <mailto:fuzzyman at voidspace.org.uk
>         <mailto:fuzzyman at voidspace.org.uk>>> wrote:
>
>            Curt Hagenlocher wrote:
>
>                "IncompleteStatement" means that the user is allowed to
>         type
>                more code.  If you want to know whether or not it's a valid
>                (complete) string, just check for it not being Invalid.  A
>                function definition is never "complete" in Python because
>                there's never a terminating curly brace :).
>
>
>            But that isn't sufficient to implement an interactive
>         interpreter
>            on top of. This code conceptually is complete as far as an
>            interactive interpreter is concerned:
>
>
>              'def f():\n  print 1\n\n'
>
>            It also means you can't distinguish between the previous
>         kind of
>            incomplete (which is incomplete because the user *could*
>         type more
>            code) and this kind of incomplete:
>
>              'a = """'
>
>            or:
>
>              'a = (1 + 2 +'
>
>            Which are both incomplete because the user *must* type more
>         code.
>            (Although the latter two give IncompleteToken - I wonder if
>         that
>            would be enough.)
>
>            Because of the other IronPython bugs we can't use the code
>         module
>            and ScriptSource / ScriptParseResult doesn't give sufficient
>            information. Any other ideas?
>
>            Michael
>
>
>                On Thu, Apr 16, 2009 at 10:05 AM, Michael Foord
>                <fuzzyman at voidspace.org.uk
>         <mailto:fuzzyman at voidspace.org.uk>
>         <mailto:fuzzyman at voidspace.org.uk
>         <mailto:fuzzyman at voidspace.org.uk>>
>                <mailto:fuzzyman at voidspace.org.uk
>         <mailto:fuzzyman at voidspace.org.uk>
>                <mailto:fuzzyman at voidspace.org.uk
>         <mailto:fuzzyman at voidspace.org.uk>>>> wrote:
>
>                   Hello guys,
>
>                   We're trying to detect whether a section of code is
>                complete (to
>                   mimic the behaviour of the interactive interpreter).
>
>                   First of all we tried using the Python standard
>         library code
>                   module which provides interactive console classes. There
>                are two
>                   outstanding bugs on codeplex (one reported by me
>         today) which
>                   prevent this being an ideal solution:
>
>                        
>         http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=22064
>                        
>         http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=21881
>
>                   The second approach was to create a ScriptSource and
>         looking at
>                   the code properties to tell if the statement is
>         complete or not
>                   (using IronPython 2.0.1). However we can never get it to
>                return a
>                   ScriptParseResult.Complete for function definitions.
>         Code below
>                   shows using \n for newlines but we have also tried
>         with \r\n.
>
>                   >>> import clr
>                   >>> clr.AddReference('IronPython')
>                   >>> clr.AddReference('Microsoft.Scripting')
>                   >>> from IronPython.Hosting import Python
>                   >>> from Microsoft.Scripting import SourceCodeKind,
>                   ScriptCodeParseResult
>                   >>>
>                   >>> engine = Python.CreateEngine()
>                   >>> s = engine.CreateScriptSourceFromString('def
>         f():\n  print
>                   1\n', 'foo', SourceCodeKind.InteractiveCode)
>                   >>> s.GetCodeProperties()
>                   <Microsoft.Scripting.ScriptCodeParseResult object at
>                   0x000000000000003F [IncompleteStatement]>
>                   >>> s = engine.CreateScriptSourceFromString('def
>         f():\n  print
>                   1\n\n', 'foo', SourceCodeKind.InteractiveCode)
>                   >>> s.GetCodeProperties()
>                   <Microsoft.Scripting.ScriptCodeParseResult object at
>                   0x0000000000000040 [IncompleteStatement]>
>                   >>>
>
>                   The DLR hosting spec has little helpful to say on
>         the matter as
>                   far as I can tell.
>
>                   Looking at an example from Tomas it doesn't seem
>         very different
>                   from what we're doing:
>
>                  
>         http://blog.tomasm.net/2009/04/15/python-says-hello-to-ruby/
>
>                   Any clues as to what we are doing wrong or how to
>         procede?
>
>                   Thanks
>
>                   Michael
>
>                   --    http://www.ironpythoninaction.com/
>                   http://www.voidspace.org.uk/blog
>
>
>                   _______________________________________________
>                   Users mailing list
>                   Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>
>                <mailto:Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>>
>                <mailto:Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>
>                <mailto:Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>>>
>
>                  
>         http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
>              
>          ------------------------------------------------------------------------
>
>
>
>                _______________________________________________
>                Users mailing list
>                Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>
>         <mailto:Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>>
>              
>          http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>                
>
>
>            --    http://www.ironpythoninaction.com/
>            http://www.voidspace.org.uk/blog
>
>
>            _______________________________________________
>            Users mailing list
>            Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>
>         <mailto:Users at lists.ironpython.com
>         <mailto:Users at lists.ironpython.com>>
>            http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
>         ------------------------------------------------------------------------
>
>         _______________________________________________
>         Users mailing list
>         Users at lists.ironpython.com <mailto:Users at lists.ironpython.com>
>         http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>          
>
>
>
>     -- 
>     http://www.ironpythoninaction.com/
>     http://www.voidspace.org.uk/blog
>
>
>     _______________________________________________
>     Users mailing list
>     Users at lists.ironpython.com <mailto:Users at lists.ironpython.com>
>     http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>   


-- 
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog





More information about the Ironpython-users mailing list