RE: Re: Re: Rule-based programming: declare variables to be a number
- To: mathgroup at smc.vnet.net
- Subject: [mg80831] RE: [mg80822] Re: [mg80797] Re: Rule-based programming: declare variables to be a number
- From: "Simons, F.H." <F.H.Simons at tue.nl>
- Date: Tue, 4 Sep 2007 03:34:33 -0400 (EDT)
- References: <fb83lf$82d$1@smc.twtelecom.net> <200709020651.CAA25850@smc.twtelecom.net> <200709031012.GAA09453@smc.vnet.net>
I have very mixed feelings about NumericQ. I agree with Andrzej that it
is a very useful function.
But for quite another reason I also agree with David Bailey. The
function NumericQ has attribute Protected, so I did not even get the
idea to try the command NumericQ[a]= True. This command should not =
work,
it violates basic principles of Mathematica.
As David states, unprotecting a Mathematica function and adding some
extra definitions is usually not a good idea. Instead, it is much better
to use TagSet, as Carl Woll did.
The other thing I do not like is that I have no idea where the
definition of NumericQ[a]= True is stored. It is not in the downvalues
of NumericQ, nor in the upvalues of a. So undoing this definition cannot
be done with Clear[NumericQ] or with UpValues[a]={}, both very natural
commands.
Finally, due to the mysterious implementation, Dynamic does not work as
expected:
Consider Dynamic[NumericQ[a]]
It shows False. Assigning a numeric value to a changes it to True, and
unassigning a changes it back to False. That is correct. The command
NumericQ[a] returns True, but the display of Dynamic incorrectly remains
False. Then do a=3, followed by a=., and Dynamic shows True. Now =
give
the command NumericQ[a]=.. Then the Dynamic object still shows True.
One of the very, very strong points of Mathematica is its uniform
structure. NumericQ seems to be a very regrettable and, as far as I can
see, unnecessary exception, despite the fact that the function works
fine.
Fred Simons
Eindhoven University of Technology
-----Original Message-----
From: Andrzej Kozlowski [mailto:akoz at mimuw.edu.pl]
Sent: maandag 3 september 2007 12:13
To: mathgroup at smc.vnet.net
Subject: [mg80831] [mg80822] Re: [mg80797] Re: Rule-based programming: declare
variables to be a number
On 2 Sep 2007, at 08:51, David Bailey wrote:
> As others have commented, it is not a good idea to write code like
> NumericQ[g]=True because this changes the basic operation of
> Mathematica. For example, such code might work OK until you try to
> combine it with some more code that needs NumericQ for something else!
>
> David Bailey
> http://www.dbaileyconsultancy.co.uk
Who are the "others"?
Anyway, I completely disagree with this statement in this particular
context.
NumericQ has clearly been designed with this in mind. Note, for
example, that althou NumericQ is Protected, a definition like
NumericQ[a]=True
does not require unprotecting NumericQ. Moreover, it does not add a
DownValue to NumericQ.
NumericQ[g] = True;
DownValues[NumericQ]
{}
There are plenty of other reasons to believe that all all
theseproperties of NumericQ are designed precisely for this type of use.
Besides, I have another reason to think that no probems of the kind you
are imagining would happen in this case: I have been using NumericQ
inprecisly this way for about 10 years in numerous notebooks without any
problems.
Note alo the post from Carl Woll which, I think, can be regarded as an
"offcial" WRI authorization for this kind of usage ;-)
(However, note also that using Carl's definition:
In[19]:= g /: NumericQ[g] = True;
Dos not actually add an UpValue to g:
UpValues[g]
{}
and I don't think it has any advantage over the more straightforward
NumericQ[g] = True;
I am sure all this is deliberate design, and even though it may not be
easy to explain, it is very convenient.
Andrzej Kozlowski
- References:
- Re: Rule-based programming: declare variables to be a number
- From: David Bailey <dave@Remove_Thisdbailey.co.uk>
- Re: Re: Rule-based programming: declare variables to be a number
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Rule-based programming: declare variables to be a number