<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">Not really; I did not want to simulate OO in Erlang (BTW Erlang feels perfectly OO to me; maybe in a very irrelevant way).</div><div class="gmail_default" style="font-family:verdana,sans-serif">
I just used C# sample to convey something similar to what I wanted to do - which as I've mentioned in other email turned out to be a horrible sample.</div><div class="gmail_default" style="font-family:verdana,sans-serif">
<br></div><div class="gmail_default" style="font-family:verdana,sans-serif">I wanted to do this:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default"><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px">
<font face="verdana, sans-serif">test(V) -></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px"><font face="verdana, sans-serif">    X = ?protocolX(V),</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px">
<font face="verdana, sans-serif">    X:act1(),</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px"><font face="verdana, sans-serif">    X:act2(),</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px">
<font face="verdana, sans-serif">    % ...</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px"><font face="verdana, sans-serif">    X:actN(SomeArguments),</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px">
<font face="verdana, sans-serif">    OtherThings().</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px">
<font face="verdana, sans-serif">Which as Bob described is not a good (or rather great) idea to use in Erlang for one that calling functions on tuples add more levels of redirection that can affect the performance in not so pleasant ways.</font></div>
<div class="gmail_default" style="font-family:arial,sans-serif;font-size:13px"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif"><font face="arial, sans-serif">I am not an Erlang guru but I really like the environment and currently I lean </font>toward<font face="arial, sans-serif"> Elixir more than Erlang; because it has macros! And I know I should not macros on a daily basis, but just knowing they are there and possible is ultra comforting.</font></font></div>
</div></div><div class="gmail_extra"><br clear="all"><div><div dir="ltr"><div><span style="font-family:tahoma,sans-serif;font-size:large">Kaveh Shahbazian</span><br></div><div><font size="1" face="arial narrow, sans-serif"><div>
“Walking on water and developing software from a specification are easy if both are frozen.” </div><div>― Edward Berard</div><div><a href="http://goo.gl/ZZ2TMu" target="_blank"><img src="http://www.linkedin.com/img/webpromo/btn_myprofile_160x33.png"></a><br>
</div><div><a href="http://stackoverflow.com/users/54467/kaveh-shahbazian" target="_blank"><img src="http://stackoverflow.com/users/flair/54467.png"></a><br></div></font></div></div></div>
<br><br><div class="gmail_quote">On Mon, Dec 16, 2013 at 6:38 AM, Richard A. O'Keefe <span dir="ltr"><<a href="mailto:ok@cs.otago.ac.nz" target="_blank">ok@cs.otago.ac.nz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
On 13/12/2013, at 7:31 PM, Kaveh Shahbazian wrote:<br>
<br>
> I wanted to write something like ((IStringer)object).ToString() (in C#) in Erlang.<br>
<br>
</div>Can you make it a little bit clearer exactly what it is you<br>
need to do?<br>
<br>
There is a fundamental distinction between the way<br>
something like<br>
        object.toString()<br>
works in OO languages<br>
        to_string(Object)<br>
works in Erlang:<br>
- in the OO languages the "object" is in charge of what<br>
  .toString() means<br>
- in Erlang, the _function_ is in charge of what to_string()<br>
  means.<br>
<div class="im">> Then I came up with this idea/code in Erlang - which is nice enough to me like:<br>
><br>
> ?stringer(my_val):to_string().<br>
><br>
</div><div class="im">> 1 - Why nobody use this or promote things based on stateful modules in Erlang?<br>
<br>
</div>Where do you get "stateful" from?  An Erlang parameterised module<br>
is a *value*.<br>
<br>
In this case, "my_val" is *still* not in charge of what to_string<br>
does.<br>
<br>
In any case, one way to begin to understand parameterised modules<br>
in Erlang is to start by thinking of<br>
<br>
        -module(foo, {X,Y,Z}).<br>
        -export([to_string/0]).<br>
        to_string() -><br>
<br>
as if it were something not entirely unlike<br>
<br>
        -module(foo).<br>
        -export([new/1,to_string/1]).<br>
        new({X,Y,Z}) -> {foo,X,Y,Z}.<br>
        to_string(This = {foo,X,Y,Z}) -> ...<br>
<br>
There is, in short, no fundamental theoretical or practical difference<br>
between<br>
<br>
        stringer(my_val):to_string()<br>
<br>
and<br>
<br>
        stringer:to_string(my_val).<br>
<br>
Anything you can do with the first you can CERTAINLY do with the second.<br>
<br>
If you want to simulate OO in Erlang,<br>
(1) lie down until the feeling passes off;<br>
(2) if the condition persists, see a doctor (of CS);<br>
(3) if the cure is unsuccessful,<br>
        represent an "object" by a tuple<br>
        {tag,Funs,Data}<br>
    where Funs is a tuple of functions shared by a number of<br>
    instances (yes, it's a vtable), and write<br>
<br>
        to_string(Obj = {_,{...,TS...},...}) -><br>
            TS(Obj).<br>
<br>
I am deadly serious about (1).<br>
<br>
When you using ((IStringer)object).to_string()<br>
you are literally saying<br>
<br>
        I don't know and I don't care what object<br>
        is as long as it conforms to the IStringer<br>
        interface.  I don't know and I don't care<br>
        what the .to_string() method does as long<br>
        as it has the right kind of arguments and<br>
        results; it could reformat my hard drive,<br>
        it could send threatening messages to the<br>
        president of the USA, it could burn down<br>
        the local hospital, I really really DON'T<br>
        CARE.<br>
<br>
If that's not what you mean, then perhaps you'd better write<br>
your code another way, even in C#.  Any time you pass around<br>
something with pluggable behaviour, ideally you need a strong<br>
type-AND-EFFECT system that lets you limit the damage that<br>
can be done, or at the least you need comments saying what is<br>
supposed to be allowed.<br>
<br>
I'm actually serious about (2) as well: see if you can find<br>
a copy of "Why Joe Hates OO" by our very own Joe Armstrong.<br>
<br>
(For the record, I am not an anti-OO bigot.  I have spent way<br>
too much of my time building a Smalltalk system I'm generally<br>
quite pleased with to be _that_.  But I have come to dread<br>
not knowing what an argument will do if I poke it, especially<br>
in a multithreading context.)<br>
<div class="im"><br>
> (OTP aside and from talking to some Erlangers they did not know that actually OTP is built around this!<br>
<br>
</div>They didn't know it because it isn't true.  For a long time Erlang<br>
didn't have parameterised modules, then it did as an experiment,<br>
and now it doesn't again.  OTP managed without them and does again.<br>
<div class="im"><br>
<br>
> So really there is a need to change how Erlang is being taught and promoted. It's possible that I am confused.).<br>
<br>
</div>If you find yourself struggling to do things the language X way<br>
in language Y, it's generally a better to look for an _idiomatic_<br>
way to solve the underlying problem in language Y than to try to<br>
warp language Y into acting like language X.  Just recently I've<br>
seen a horrible example of a Prolog system being warped to be<br>
more like JavaScript, to the applause of people who haven't<br>
thought about the benefits of being able to use other Prolog<br>
systems as well...<br>
<br>
As one example, it's not unknown for an Erlang module that<br>
defines a data type to export a format/1 and maybe format/2<br>
for converting an instance to a string or writing it to a<br>
stream.  Using<br>
<br>
        snorkelwhacker:format(Monster)<br>
<br>
makes it clear that Monster is supposed to be the kind of thing<br>
that the snorkelwhacker module knows about; this might be one of<br>
several things.</blockquote></div><br></div>