Hello,

On Thu, Aug 19, 2010 at 2:54 PM, Jeroen Demeyer <jdeme...@cage.ugent.be> wrote:
> I noticed some classes in Sage have a _pari_ method (which seems to be
> used to convert self to a PARI GEN).  But there is also _pari_init_,
> which seems to be more or less the same (although, through a string).
> What is the point of this?  If there is any documentation about this,
> feel free to point it out to me.

Here's what is going on.  We have the pexpect interface to GP (which
we will refer to as gp) as well as C interface to PARI (which we will
refer to as pari).

gp:
   - Defined in sage/intefaces/gp.py
   - Specifies name="pari" in the constructor
(sage/interfaces/gp.py:156), which would normally make gp(foo) try to
call foo._pari_(), but there is special case code in Expect.__call__
to change this to use foo._gp_() instead.
(sage/interfaces/expect.py:1056)
   -  foo._gp_(gp) which is supposed to return a GpElement
   - SageObject provides a default implementation of _gp_() which
calls SageObject._interface_(gp), which in turn tries to call
_pari_init_ (since gp has name="pari")
   - Generally, the thing returned from the _XXX_init_ methods is a
string, but what really matters is that it is some object such that
when it's passed to the __call__ method of the interface object, it
"returns the right thing".  See sage/structure/sage_object.pyx:387.
   - SageObject also defines a default implementation of _gp_init_
which just calls _pari_init_.  I don't think this function is run
anywhere.


pari:
  - Defined in sage/libs/pari/gen.pyx
  - Uses foo._pari_() which is supposed to return a PARI GEN object.
sage/libs/pari/gen.pyx:8414
  - SageObject defines a default implementation of _pari_() which will
try calling pari(foo._pari_init_()).
  - pari("string") will eventually call gp_read_str("string") which
should return a GEN object.

The idea behind all of the _XXX_ and _XXX_init_ methods is that _XXX_
returns the actual object whereas _XXX_init_ returns something which
is fed into the parent's __call__ method.

The reason why the PARI situation is a bit more complicated is that
anything string you return from _gp_init_ should be valid as a
_pari_init_ function.  We should really name the name="pari" in the gp
Expect object so that we can remove the special case code.  We should
then also just have the default implementation of _gp_init_ call
_pari_init_ so that if you just define that, it will work for both gp
and pari.

Sorry it took so long to answer this.

--Mike

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