MathGroup Archive 2009

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

Search the Archive

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


  • Prev by Date: Re: Beginning syntax problems
  • Next by Date: Re: Beginning syntax problems
  • Previous by thread: Set::setps error? Twitter.m's OOP-like approach?
  • Next by thread: Re: Set::setps error? Twitter.m's OOP-like approach?