On Mon, Aug 10, 2009 at 8:43 AM, Kiran Kedlaya <ksk...@gmail.com> wrote:
> > What would you expect from the following input into the notebook? > > CELL 1: > u = 2+2 > u = 2+3 > > CELL 2: > print u > > If you try something like this at a command line, the first line gives > an error due to the spaces in front. No it doesn't, at least not for me. flat wstein$ sage ---------------------------------------------------------------------- | Sage Version 4.1, Release Date: 2009-07-09 | | Type notebook() for the GUI, and license() for information. | ---------------------------------------------------------------------- Loading Sage library. Current Mercurial branch is: heckeindex sage: u = 2+2 sage: u = 2+3 sage: print u 5 I know it won't give an error, because on the command line all spaces and sage: and >>> prompts are stripped from the left for non-continuation lines. However, you might have meant the pure python command line, which does give an error: flat:kamienny wstein$ sage -python Python 2.6.2 (r262:71600, Jul 8 2009, 17:42:25) [GCC 4.0.1 (Apple Inc. build 5465)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> u = 2 + 2 File "<stdin>", line 1 u = 2 + 2 ^ IndentationError: unexpected indent >>> > But on my notebook server > (running 4.1), the first cell evaluates without an error, and the > second one returns 4, not 5. ?! > > Kiran This must be a bug in the notebook, related to exec compile, which the notebook uses to evaluate cells. Here's the code that actually gets executed: ---------------------------------------------------------------- flat:code wstein$ pwd /Users/wstein/.sage/sage_notebook/worksheets/admin/222/code flat:code wstein$ more 16.py # -*- coding: utf_8 -*- from __future__ import with_statement print "^Ab14" os.chdir("/Users/wstein/.sage/sage_notebook/worksheets/admin/222/cells/5") sage.server.notebook.interact.SAGE_CELL_ID=5 _sage_const_3 = Integer(3); _sage_const_2 = Integer(2) exec compile(ur'u = _sage_const_2 +_sage_const_2\u000a u = _sage_const_2 +_sage_const_3' + '\n', '', 'single') print "^Ae14" ---------------------------------------------------------------- The code if you get rid of the spaces to the left we get: flat:code wstein$ more 23.py ... _sage_const_3 = Integer(3); _sage_const_2 = Integer(2) u = _sage_const_2 +_sage_const_2 exec compile(ur'u = _sage_const_2 +_sage_const_3' + '\n', '', 'single') ------------------------- Notice that "exec compile" is supposed to only be used on the *last* line of input. The reason for this is so that the display print hook is called, e.g., so if you type a = 5 a + 1 b = 7 a + b in a notebook cell, at least you'll see 12 (=a+b) come out. You will not see 6 from "a+1" though. So the problem you're seeing is because the code in the notebook to determine "the last line of code" takes account special cases when the last line is indented, so e.g., the following would work: for z in range(10): z and print out each of the z's (just like "for z in range(10): z"). In fact, the above is turned into: _sage_const_5 = Integer(5) exec compile(ur'for z in range(_sage_const_5 ):\u000a z' + '\n', '', 'single') The problem is that when we input u = 2 +2 u = 2 + 3 both indented, then everything is combined into one single exec compile, and surprisingly we have in pure python: >>> _sage_const_3 =3; _sage_const_2 = 2>>> exec compile(ur'u = _sage_const_2 +_sage_const_2\u000a u = _sage_const_2 +_sage_const_3' + '\n', ... '', 'single')>>> >>> u 4 I'm surprised this doesn't set u to 5. It might have something to do with the "\u000a" which is the unicode character for linefeed. Basically, I find the following behavior of Python's exec command really weird/broken/surprising. I would expect an error in the latter two cases: >>> exec compile(ur'for z in range(5):\u000a z', '','single')0 1 2 3 4 >>> exec compile(ur'u=2+2\u000a u=3+3', '','single') >>> print u 4 >>> exec compile(ur'u=10\u000a u=3+*fr%Acn @#!^2n2azzz3', '','single') >>> print u 10 I hope a Python interpreter expert such as Robert Bradshaw can comment on this. In the meantime, if I were to spend more time on this now (which I won't), I would read the docs for exec and compile carefully, then probably just find a way to program around this surprising (to me) case in server/notebook/worksheet.py (which generates the exec compile code that is run above). This is now trac #6729: http://trac.sagemath.org/sage_trac/ticket/6729 Since this is a notebook bug I've cc'd the codenode list, since probably they have some brilliant vastly better way of telling Python to evaluate a block of code, which completely avoids this whole problem. If so, please do tell. -- William --~--~---------~--~----~------------~-------~--~----~ To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---