Re: Set::setps error? Twitter.m's OOP-like approach?

*To*: mathgroup at smc.vnet.net*Subject*: [mg104813] Re: Set::setps error? Twitter.m's OOP-like approach?*From*: Erik Max Francis <max at alcyone.com>*Date*: Tue, 10 Nov 2009 06:03:21 -0500 (EST)*References*: <200911030757.CAA01654@smc.vnet.net> <hcr7ps$8th$1@smc.vnet.net>

Daniel Lichtblau wrote: > 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. Okay. I see that since Mathematica is far more functional a language than other languages that I've used and so what I was trying to do there was quite alien -- sufficiently so that I really shouldn't try. (In this particular case, I was just taking a rather typical OOP example and playing with it in Python, it wasn't central to my question below ...) >> 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.) > > I'll reread that blog, but I suspect it's one of those things that is > incomprehensible to those past a certain age. Well, when I boil down when I'm talking about here it's not so much OOP per se but rather opaque types, giving the ability to pack lots of stuff in an object, hide it with a nice face by using Format[..., Standard] := ...., and then define a bunch of functions that take it at the first argument and manipulate it. The context I mentioned above is a tensor library where you don't really want to see the components of the tensor unless you specifically ask for it -- a 4-dimensional Riemann tensor, after all, has 4^4 components -- but instead you just want to specify a set of coordinates, a metric using those coordinates, and then go to town creating and manipulating those tensors, then crank out specific calculations based on them. Does that make more sense as being something reasonably Mathematica-ish, using that approach for type opaqueness? -- Erik Max Francis && max at alcyone.com && http://www.alcyone.com/max/ San Jose, CA, USA && 37 18 N 121 57 W && AIM/Y!M/Skype erikmaxfrancis Can I walk with you / 'Till the day that my heart stops beating -- India Arie

**Follow-Ups**:**Re: Re: Set::setps error? Twitter.m's OOP-like approach?***From:*Daniel Lichtblau <danl@wolfram.com>

**References**:**Set::setps error? Twitter.m's OOP-like approach?***From:*Erik Max Francis <max@alcyone.com>