On Wed, Nov 18, 2009 at 1:23 AM, Fernando Perez <fperez....@gmail.com> wrote:
> On Tue, Nov 17, 2009 at 7:51 PM, William Stein <wst...@gmail.com> wrote:
>> Can somebody referee this?     It's mainly code in the *notebook* --
>> it doesn't seem possible to do something like the above on the command
>> line without some deep internal change to Ipython.
>>
>
> Actually no, not that hard: ipython executes all  user  code inside a

Awesome.  I've made a new ticket for doing a command-line version for Sage:

   http://trac.sagemath.org/sage_trac/ticket/7486

and I've posted your email and code there.

I will also try using a dictionary instead catching NameError's.  I
don't know if that will robustly work in all cases for the notebook,
but we'll see.

> dict created at initialization time.  One could replace this (today a
> plain python dict) with another dict that would implement the
> requested behavior.  This would spring variables into existence when a
> KeyError was about to occur.
>
> The command-line doesn't have the notion of a cell (yet, that will
> hopefully change soon) but it could be toggled with a function call.
>
> It's basically a matter of instantiating the initial ipython with a
> custom user_ns dict that does the above, that should be all.  And
> providing a magic (or even plain) function in the global namespace to
> toggle this behavior on/off at runtime.
>
> The attached file (run it as 'ipauto.py') shows how it could work, I
> didn't implement the toggling and it's a quick hack, but the basic
> idea is  there.  Here it is in action:
>
> In [1]: %autocall 0
> Automatic calling is: OFF
>
> In [2]: x+y
> Injecting x
> Injecting y
> Out[2]: x + y
>
> In [3]: type(x)
> Out[3]: <class 'sympy.core.symbol.Symbol'>
>
> In [4]: x+3
> Out[4]: 3 + x
>
> In [5]: x**2+x*x
> Out[5]: 2*x**2
>
> In [6]: x+z**3
> Injecting z
> Out[6]: x + z**3
>
>
> A couple of notes:
>
> - It's key to disable autocalling for this to work, otherwise too many
> false positives are triggered.  If this idea proves to have  wings, it
> will be one more argument in favor of disabling autocalling (it just
> has too many uncontrollable side effects).
>

In Sage autocall is disabled by default, since it is too confusing.

> - Unfortunately IPython as shipped needs a tiny patch for this to
> work, due to a really silly omission.  The patch is a trivial 2-liner,
> in case anyone wants to take this further for Sage:
>
> (ipython-0.10)maqroll[0.10]> bzr diff
> === modified file 'IPython/Shell.py'
> --- IPython/Shell.py    2009-04-14 20:12:02 +0000
> +++ IPython/Shell.py    2009-11-18 09:03:01 +0000
> @@ -1230,7 +1230,7 @@
>
>
>  # This is the one which should be called by external code.
> -def start(user_ns = None):
> +def start(user_ns = None, user_global_ns = None):
>     """Return a running shell instance, dealing with threading options.
>
>     This is a factory function which will instantiate the proper IPython shell
> @@ -1238,7 +1238,7 @@
>     different GUI toolkits require different thread handling details."""
>
>     shell = _select_shell(sys.argv)
> -    return shell(user_ns = user_ns)
> +    return shell(user_ns = user_ns, user_global_ns = user_global_ns)
>
>  # Some aliases for backwards compatibility
>  IPythonShell = IPShell

Thanks!

 -- 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
URL: http://www.sagemath.org

Reply via email to