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 <[email protected] <mailto:[email protected]>> 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
        <[email protected] <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>> 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
               <[email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
               <mailto:[email protected]
        <mailto:[email protected]>
               <mailto:[email protected]
        <mailto:[email protected]>>>> 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
                  [email protected]
        <mailto:[email protected]>
               <mailto:[email protected]
        <mailto:[email protected]>>
               <mailto:[email protected]
        <mailto:[email protected]>
               <mailto:[email protected]
        <mailto:[email protected]>>>

http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


------------------------------------------------------------------------



               _______________________________________________
               Users mailing list
               [email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

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


           _______________________________________________
           Users mailing list
           [email protected]
        <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
           http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


        ------------------------------------------------------------------------

        _______________________________________________
        Users mailing list
        [email protected] <mailto:[email protected]>
        http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


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


    _______________________________________________
    Users mailing list
    [email protected] <mailto:[email protected]>
    http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


------------------------------------------------------------------------

_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


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


_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to