You'll need to override __neg__.

Aaron Meurer

On Oct 13, 2013, at 3:35 AM, Ben Lucato <[email protected]> wrote:

Thanks for your help - I've been doing a bit of work on this.

Another thing:

x = noevalMul(2, 5)
y = -x

The type of y is a sympy.core.Integer - i.e. the assignment of y to -x
evaluates x in the process. I'm not sure what behaviour I need to override
for this.

BTW what I did with the printing is subclass LatexPrinter so I keep a lot
of the already-done work.


On 13 October 2013 03:27, Aaron Meurer <[email protected]> wrote:

> Yes, for general objects, you have to override __new__. In general,
> you just need to define a __new__ that looks like the one above,
> except without the "if evaluate" branch (if you don't care about
> noncommutatives you can skip that bit too).  Basically
>
> - sympify the arguments. _sympify is used so that strings aren't supported.
> - Create a new Expr of the given class. If your class doesn't subclass
> from Expr, use Basic instead. This contains some vital logic such as
> setting up the hash, so don't skip it.
> - Return that object.
>
> By the way, for your Add and Mul, in your flatten, you may want to
> override flatten to actually flatten things, so that NoevalAdd(x, y,
> NoevalAdd(z, t)) is the same as NoevalAdd(x, y, z, t). Otherwise,
> there's little point in overriding flatten instead of __new__ there.
>
> Aaron Meurer
>
>
> On Fri, Oct 11, 2013 at 8:21 AM, Ben Lucato <[email protected]> wrote:
> > This is awesome!!! Your simple fix with overriding flatten() works
> > perfectly. My last question is -- how do you do the same thing with Pow?
> It
> > is subclassed differently to Add, Mul (which both subclass "AssocOp").
> > I have taken a look at the source code (go me!!!) - it seems that in this
> > case, because Pow is defined like this:
> >
> > "def __new__(cls, b, e, evaluate=True):
> > b = _sympify(b) e = _sympify(e) if evaluate: if e is S.Zero: return S.One
> > elif e is S.One: return b else: obj = b._eval_power(e) if obj is not
> None:
> > return obj obj = Expr.__new__(cls, b, e) obj.is_commutative =
> > (b.is_commutative and e.is_commutative) return obj"
> >
> >
> > So it seems a change to __new__ is necessary, right? It looks like
> > evaluate=False is not even supported for Pow - am I right? (just a noob
> > asking questions)
> >
> > Thanks!!
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> > "sympy" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> > email to [email protected].
> > To post to this group, send email to [email protected].
> > Visit this group at http://groups.google.com/group/sympy.
> > For more options, visit https://groups.google.com/groups/opt_out.
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "sympy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sympy/zilEXwN26so/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
>



-- 


Ben Lucato
----------------------------------------------------------------------------------
Phone: +61 400 159 632 | Email: [email protected]

-- 
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an
email to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to