On 12/19/10 06:52, spir wrote: > On Sun, 19 Dec 2010 03:37:37 -0600 > Christopher Nicholson-Sauls <ibisbase...@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