Re: Setting upvalues, using ^:=, such that they get actually used
- To: mathgroup at smc.vnet.net
- Subject: [mg96453] Re: Setting upvalues, using ^:=, such that they get actually used
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Fri, 13 Feb 2009 03:49:28 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <gn11lk$86h$1@smc.vnet.net>
In article <gn11lk$86h$1 at smc.vnet.net>,
Niko <niko.schwarz at googlemail.com> 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
instance,
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
Regards,
--Jean-Marc