Re: How to get non-printing heads?
- To: mathgroup at smc.vnet.net
- Subject: [mg46968] Re: How to get non-printing heads?
- From: bobhanlon at aol.com (Bob Hanlon)
- Date: Thu, 18 Mar 2004 01:24:53 -0500 (EST)
- References: <c388k0$bnb$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Clear[a,b,f, g, y, isConstant];
Constant is an attribute not a head
SetAttributes[a, Constant]
Dt[#,t]& /@ {a, b, y, E, 3}
{0, Dt[b, t], Dt[y, t], 0, 0}
isConstant[x_] := NumericQ[x] || !FreeQ[Attributes[x], Constant];
The test for NumericQ is needed since Attributes does not know how to handle
numbers that are not numeric symbols (such as Pi and E)
isConstant /@ {a, b, y, E, 3}
{True, False, False, True, True}
b /: Head[b] = newHead;
Head[#]===newHead& /@ {a, b, y, E, 3}
{False, True, False, False, False}
f[x_?(Head[#]===newHead&)] = 0;
f /@ {a, b, y, E, 3}
{f[a], 0, f[y], f[E], f[3]}
g[x_?(Head[#]===newHead || isConstant[#]&)] = 0;
g /@ {a, b, y, E, 3}
{0, 0, g[y], 0, 0}
Bob Hanlon
In article <c388k0$bnb$1 at smc.vnet.net>, kj <socyl at 987jk.com> wrote:
<< How can I give a Mathematica object a different head?
I tried
In[1]:= Head[a] ^= Constant;
But, as shown below, this doesn't work as desired:
In[2]:= MatchQ[a, _Constant]
Out[2]= False
In[3]:= MatchQ[a, _Symbol]
Out[3]= True
I even tried
In[4]:= a/: MatchQ[a, _Constant] = True;
In[5]:= ??a
Global`a
Head[a] ^= Constant
a /: MatchQ[a, _Constant] = True
...but
In[6]:= MatchQ[a, _Constant]
Out[6]= False
Is there any way to give "a" a user-defined head?
My immediate goal is to be able to define functions that perform
algebraic manipulations on Mathematica expressions according to
the types of the objects they contain. I want to leave these
objects pretty much undefined, other than specifying their types.
E.g.:
myDerivative[x_Constant] := 0;
myDerivative[a]
==> 0
myDerivative[b]
==> myDerivative[b] (* Derivative doesn't know how to handle Symbol *)
>><BR><BR>