Re: Set::setps error? Twitter.m's OOP-like approach?
- To: mathgroup at smc.vnet.net
- Subject: [mg104555] Re: Set::setps error? Twitter.m's OOP-like approach?
- From: ADL <alberto.dilullo at tiscali.it>
- Date: Wed, 4 Nov 2009 01:31:44 -0500 (EST)
- References: <hconr9$1lj$1@smc.vnet.net>
You might try with this "overloading" approach: {NAME, BALANCE} = Range[2]; ClearAll[Account, create, getName, getBalance, deposit]; Account /: (f_[p___, Account[t_, n_], m___] /; MemberQ[{Plus, Subtract, Times, Divide, Power}, f]) := Account[t, f[p, n, m]]; create[name_, balance_] := Account[name, balance]; getName[account_Account] := account[[NAME]]; getBalance[account_Account] := account[[BALANCE]]; deposit[account_Account, amount_] := account = account + amount; This is the resulting behavior: In[8]:= a=create["test",Random[Integer,{0,200}]] Out[8]= Account(test,176) In[9]:= getBalance[a] Out[9]= 176 In[10]:= b=a+10 Out[10]= Account(test,186) In[11]:= b=a 10 Out[11]= Account(test,1760) In[12]:= b=10a Out[12]= Account(test,1760) In[13]:= b=a/10 Out[13]= Account(test,88/5) In[14]:= b=10/a Out[14]= Account(test,5/88) In[15]:= b=a^2 Out[15]= Account(test,30976) In[16]:= deposit[a,25] Out[16]= Account(test,201) In[17]:= deposit[b,25] Out[17]= Account(test,31001) In[18]:= a Out[18]= Account(test,201) In[19]:= b Out[19]= Account(test,31001) ADL On Nov 3, 8:58 am, Erik Max Francis <m... at alcyone.com> wrote: > I was experimenting with vaguely OOP-like wrappers around data similar > to how Twitter.m does things: > > http://blog.wolfram.com/2009/04/30/twittering-with-mathema= tica/ > > I was experimenting with "mutable objects" and I'm running into a > scoping problem of some type that I don't understand. Here's some > sample code creating a wrapper around an "account balance": > > In[1]:= {NAME, BALANCE} = Range[2] > > Out[1]= {1, 2} > > In[2]:= create[name_, balance_] := Account[name, balance] > > In[3]:= getName[account_Account] := account[[NAME]] > > In[4]:= getBalance[account_Account] := account[[BALANCE]] > > In[5]:= deposit[account_Account, amount_] := > account[[BALANCE]] += amount > > The deposit function doesn't work, though: > > In[6]:= a = create["test", 100] > > Out[6]= Account["test", 100] > > In[7]:= getBalance[a] > > Out[7]= 100 > > In[8]:= deposit[a, 25] > > During evaluation of In[8]:= Set::setps: Account[test,100] in the part > assignment is not a symbol. >> > > Out[8]= 125 > > In[9]:= getBalance[a] > > Out[9]= 100 > > But here's what I'm confused; if I do what getBalance does manually, it > works fine: > > In[10]:= a[[BALANCE]] += 25 > > Out[10]= 125 > > In[11]:= a > > Out[11]= Account["test", 125] > > The Set::setps error is about Blocks so I suppose I'm running into some > scoping issue but I don't follow what it is. What am I missing here? > What's the right way to write getBalance? > > Do Mathematica users find Twitter.m's approach to wrapping around > objects palatable in the first place? (My eventual application is for = a > wrapper around tensor objects where multiple things have to be carted > around and the normal display of such objects would be far too ungainly > to be acceptable anyway.) > > Thanks. > > -- > Erik Max Francis && m... at alcyone.com &&http://www.alcyone.com/max/ > San Jose, CA, USA && 37 18 N 121 57 W && AIM/Y!M/Skype erikmaxfrancis > Wyrd has swept all my kin / all the brave chiefs away! / Now I mus= t > follow them! -- Beowulf