Re: Set::setps error? Twitter.m's OOP-like approach?
- To: mathgroup at smc.vnet.net
- Subject: [mg104611] Re: [mg104546] Set::setps error? Twitter.m's OOP-like approach?
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Wed, 4 Nov 2009 01:42:27 -0500 (EST)
- References: <200911030757.CAA01654@smc.vnet.net>
Erik Max Francis 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-mathematica/ > > 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? You are using the formal argument "account" in the manner of a call-by-reference" parameter. One can emulate that in Mathematica by making it a held argument. SetAttributes[deposit, HoldFirst] Now you have a new problem, which is that the head will not be recognized as Account (it will be Symbol, because all that is seen before the rule fires is "a", sans quotes). No big deal, we'll evaluate it and check the head. deposit[account_, amount_] /; Head[Evaluate[account]] === Account := account[[BALANCE]] += amount That should work for the purpose you have in mind. > 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. I'll reread that blog, but I suspect it's one of those things that is incomprehensible to those past a certain age. Daniel Lichtblau Wolfram Research
- References:
- Set::setps error? Twitter.m's OOP-like approach?
- From: Erik Max Francis <max@alcyone.com>
- Set::setps error? Twitter.m's OOP-like approach?