[IronPython] InteractiveCode and function definitions

Curt Hagenlocher curt at hagenlocher.org
Thu Apr 16 19:51:35 CEST 2009


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.  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.

[*] 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>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>> 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>
>>    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
>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20090416/267d09f7/attachment.html>


More information about the Ironpython-users mailing list