I suggest explicitly checking for the final blank line. That's what our command line does.
> -----Original Message----- > From: [email protected] [mailto:users- > [email protected]] On Behalf Of Michael Foord > Sent: Thursday, April 16, 2009 10:55 AM > To: Discussion of IronPython > Subject: Re: [IronPython] InteractiveCode and function definitions > > 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]>> 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]>>> 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]>> > > > > 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 _______________________________________________ Users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
