MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Setting upvalues, using ^:=, such that they get actually used

  • To: mathgroup at
  • Subject: [mg96453] Re: Setting upvalues, using ^:=, such that they get actually used
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at>
  • Date: Fri, 13 Feb 2009 03:49:28 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <gn11lk$86h$>

In article <gn11lk$86h$1 at>,
 Niko < at> wrote:

> Ok, I stumbled across Upvalues today and I thought they were gorgeous
> for my case.
> My case is this: I need the intersection of two really large sets, it
> looks like this:
> Intersection[sym[l], sym[q]]
> Now, they are really two large to compute them. I can compute the
> intersection faster myself. So, I tossed along and defined something
> like this:
> Intersection[sym[a_], sym[b_]] ^:= 42
> Unfortunately, Mathematica has a strong preference for using the
> downvalue of sym for the computation, regardless of the order I use
> for input.
> If I undefine "sym", things work fine, but that is of course a whole
> lot less elegant. Is there a way to "push" the priority of the upvalue
> definition, so it gets used whenever possible?

Not sure whether the following fully addresses your problem, but you 
could add the attribute *HoldAll* to the function *Intersection[]*. For 

In[1]:= Intersection[sym[l], sym[q]]

Out[1]= sym[]

In[2]:= Intersection[sym[a_], sym[b_]] ^:= 42

In[3]:= Intersection[sym[l], sym[q]]

Out[3]= 42

In[4]:= sym[x_] := RandomInteger[{1, 10}, RandomInteger[{1, 5}]]

In[5]:= Intersection[sym[l], sym[q]]

Out[5]= {1, 2}

In[6]:= SetAttributes[Intersection, HoldAll]
Intersection[sym[l], sym[q]]

Out[7]= 42


  • Prev by Date: Re: copy/paste of exponents
  • Next by Date: Re: Scalar plot in 3D
  • Previous by thread: Setting upvalues, using ^:=, such that they get actually used
  • Next by thread: Scalar plot in 3D