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