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)

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:
>
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