define methods apart

Christopher Nicholson-Sauls ibisbasenji at gmail.com
Mon Dec 20 03:01:49 PST 2010


On 12/19/10 06:52, spir wrote:
> On Sun, 19 Dec 2010 03:37:37 -0600
> Christopher Nicholson-Sauls <ibisbasenji at gmail.com> wrote:
> 
>> On 12/18/10 07:19, spir wrote:
>>> Hello,
>>>
>>>
>>> I cannot find a way to define methods (I mean "member functions) outside the main type-definition body:
>>>
>>> struct X {}
>>> void X.say () {writeln("I say!");}
>>> ==>
>>> Element.d(85): semicolon expected, not '.'
>>>
>>> Do I overlook anything, or is this simply impossible? In the latter case, what is the problem?
>>> (In many languages, not only dynamic ones, method are or at least can be defined apart.)
>>>
>>>
>>> Denis
>>> -- -- -- -- -- -- --
>>> vit esse estrany ☣
>>>
>>> spir.wikidot.com
>>>
>>
>> As bearophile says, it just isn't the "D way" to do things.
>>
>> But, if you absolutely must (or just want to, for "playing" sakes) there
>> are ways of faking it using opDispatch.  Here's one I just tossed
>> together and tested (DMD 2.050) right now.
>>
>> [code snipped]
>>
>> Generally speaking, though, I'm not sure what the real value would be in
>> doing this in D.  Did you have a particular use case in mind, or was it
>> just idle exploration?
> 
> Thank you very for this example use of opdispatch :-)
> I'm still exploring the language (which I like very much, except for some given features *). Actually, I just wanted to know whether it's possible, because I'm used to this way and find it more practicle or readable in various cases. But it is not a problem.
> 
> Denis
> 
> (*) Some inherited from C/C++ (unhelpful syntax or semantics, mainly), some among the newest (too abstract or complicated, i'd say).
> -- -- -- -- -- -- --
> vit esse estrany ☣
> 
> spir.wikidot.com
> 

No problem.  opDispatch has a number of possible uses.  Another thing
I've done with it before is to wrap the message passing system from
std.concurrency, to ease defining message protocols.  Basically I define
a message as a struct, then define an opDispatch that looks for the
pattern 'sendBLAH(...)' and forwards that to 'tid.send(BLAHMessage(...),
thisTid())' auto-magically.  To make it really magical I had to create
some code-generation for the receiving end so it would provide an
argument to receive/receiveTimeout for each handleBLAH method I define.

It had a few little bugs/quirks though, which is why I haven't ever
shared it.

-- Chris N-S


More information about the Digitalmars-d-learn mailing list