MathGroup Archive 2001

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

Search the Archive

Re: Creating Objects

  • To: mathgroup at smc.vnet.net
  • Subject: [mg31658] Re: Creating Objects
  • From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
  • Date: Fri, 23 Nov 2001 05:46:33 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

Oleg Burd wanted help using the (Classes.m) package.  

While I am fluent with nearly everything in Mathematica, I have very little
experience in OOP.  So others may be able to give better answers.  Well it
appears to me that the (Classes.m) package forces one to write messy code.
Because of that and my limited background with OOP I will not try to correct
Oleg's use of (Classes.m).  However, the code below might be helpful because
it demonstrates how you can use some OOP concepts in Mathematica.

Below 'MyList' is like a class with 4 members ( 2 Strings, 1 Integer, 1 Real
).
I provide functions that get the Strings, Integer and Real from a MyList
'object'.

In[1]:=
   MyList[expr_]:= MatchQ[expr,{_String,_String,_Integer,_Real}]
   GetStrings[expr_?MyList]:= Take[expr,2];
   GetInt[expr_?MyList]:= Part[expr,3];
   GetReal[expr_?MyList]:= Last[expr];


In[5]:=
    GetStrings[{ "Ted", "Ersek", 24,  9.34 }]

Out[5]=
    { Ted,  Ersek }

Next I define 'PositiveList'  which is like a subclass of 'MyList'. 
An expression is a 'PositiveList' if it is a 'MyList' where the Integer and
Real numbers are positive. 
PositiveList effectively inherits all the features of MyList.  Next I define
a function (foo).  
When the argument of (foo) is a 'PositiveList' the product of the Integer
and Real is returned.

In[6]:=
    PositiveList[expr_]:=
       MyList[expr] && Positive[GetInt[expr]] && Positive[GetReal[expr]]

In[7]:=
    foo[expr_?PositiveList]:= GetInt[expr] * GetReal[expr]


In[8]:=
    foo[{ "Ted", "Ersek", 24,  9.34}]

Out[8]=
    224.16

-----------------------------
Next I demonstrate that polymorphisism is easy in Mathematica. 
Below I define a function (f) where
    f[x]= x^2  when (x is a multiple of 3)
    f[x]=x^2-1 for all other Integers
    f[x]=x  when (x) is Real


In[9]:=
    f[ x_Integer?(Mod[#,3]===0&) ]:=  x^2;
    f[ x_Integer ]:=  x^2-1;
    f[ x_Real ]:=  x


In[12]:=
    { f[9], f[10], f[11], f[12], f[2.3] }

Out[12]=
   { 81, 99, 120, 144, 2.3 }

Inspite of these demonstrations I recommend that you don't try follow a
familiar paradigm (e.g. OOP) in Mathematica.  Instead you should learn
Mathematica and you will see how things should be done in Mathematica.  If
you still have concerns about code reusability, maintenance and reviews
others might be better able to further explain how those issues can be dealt
with in Mathematica. 
----------- 
Regards, 
Ted Ersek 
Check Mathematica Tips, Tricks at 
http://www.verbeia.com/mathematica/tips/Tricks.html



  • Prev by Date: RE: Creating Objects
  • Next by Date: Re: Log plots: plot points *linearly* equidistant
  • Previous by thread: RE: Creating Objects
  • Next by thread: Column problem