www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.announce - Little demo of allowing basic types to implement interfaces.

reply Rory McGuire <rjmcguire gmail.com> writes:
I was wondering if its possible to do interfaces the way #golang does it
but in #dlang.

Here is my first try: https://gist.github.com/rjmcguire/6431542.
 Any help on making this smaller would be awesome.

Cheers,
R
Sep 03 2013
next sibling parent reply "Rory McGuire" <rjmcguire gmail.com> writes:
On Wednesday, 4 September 2013 at 00:56:55 UTC, Rory McGuire 
wrote:
 I was wondering if its possible to do interfaces the way 
 #golang does it
 but in #dlang.

 Here is my first try: https://gist.github.com/rjmcguire/6431542.
  Any help on making this smaller would be awesome.

 Cheers,
 R
Here is another example use, checking if a type can convert itself to ubyte[]: void main() { int i = 0x34342343; writebytes(i); } interface IRawBytes { ubyte[] bytes(); } void writebytes(T)(T item) if (Implements!(T, IRawBytes)) { import std.stdio : writeln; writeln(item.bytes); } ubyte[] bytes(ref int i) { ubyte* ptr; ptr = cast(ubyte*)&i; return ptr[0..i.sizeof]; } In the above example you get a nice error message if int does not have the "bytes" ufcs function. missing: ubyte[] int.bytes() int, does not implement interface: traits.IRawBytes traits.d(18): Error: template traits.writebytes does not match any function template declaration. Candidates are: ...
Sep 03 2013
parent reply "Rory McGuire" <rjmcguire gmail.com> writes:
On Wednesday, 4 September 2013 at 06:26:08 UTC, Rory McGuire 
wrote:
 On Wednesday, 4 September 2013 at 00:56:55 UTC, Rory McGuire 
 wrote:
 I was wondering if its possible to do interfaces the way 
 #golang does it
 but in #dlang.

 Here is my first try: 
 https://gist.github.com/rjmcguire/6431542.
 Any help on making this smaller would be awesome.

 Cheers,
 R
Here is another example use, checking if a type can convert itself to ubyte[]:
You can play with it here: http://dpaste.dzfl.pl/d7a727fd I still need to implement the part that checks aggregates.
Sep 03 2013
parent "Rory McGuire" <rjmcguire gmail.com> writes:
On Wednesday, 4 September 2013 at 06:27:54 UTC, Rory McGuire 
wrote:
 On Wednesday, 4 September 2013 at 06:26:08 UTC, Rory McGuire 
 wrote:
 On Wednesday, 4 September 2013 at 00:56:55 UTC, Rory McGuire 
 wrote:
 I was wondering if its possible to do interfaces the way 
 #golang does it
 but in #dlang.

 Here is my first try: 
 https://gist.github.com/rjmcguire/6431542.
 Any help on making this smaller would be awesome.

 Cheers,
 R
Here is another example use, checking if a type can convert itself to ubyte[]:
You can play with it here: http://dpaste.dzfl.pl/d7a727fd I still need to implement the part that checks aggregates.
hmmm, turns out it works on aggregates too. works for structs, classes and basic types such as int and long. Makes me wonder; is this in the standard library.
Sep 03 2013
prev sibling parent reply "Tobias Pankrath" <tobias pankrath.net> writes:
On Wednesday, 4 September 2013 at 00:56:55 UTC, Rory McGuire 
wrote:
 I was wondering if its possible to do interfaces the way 
 #golang does it
 but in #dlang.

 Here is my first try: https://gist.github.com/rjmcguire/6431542.
  Any help on making this smaller would be awesome.

 Cheers,
 R
Will this break, if I implement the free standing functions in a different module that is not in scope of the Implements! template?
Sep 04 2013
next sibling parent reply Rory McGuire <rjmcguire gmail.com> writes:
yes, it does seem to break if the Implements template func is in a
different module to the free standing func.

hmph, how to get around that.


On Wed, Sep 4, 2013 at 9:04 AM, Tobias Pankrath <tobias pankrath.net> wrote:

 On Wednesday, 4 September 2013 at 00:56:55 UTC, Rory McGuire wrote:

 I was wondering if its possible to do interfaces the way #golang does it
 but in #dlang.

 Here is my first try:
https://gist.github.com/**rjmcguire/6431542<https://gist.github.com/rjmcguire/6431542>
 .
  Any help on making this smaller would be awesome.

 Cheers,
 R
Will this break, if I implement the free standing functions in a different module that is not in scope of the Implements! template?
Sep 04 2013
parent "Dicebot" <public dicebot.lv> writes:
On Wednesday, 4 September 2013 at 08:44:45 UTC, Rory McGuire 
wrote:
 yes, it does seem to break if the Implements template func is 
 in a
 different module to the free standing func.

 hmph, how to get around that.
I don't think it is possible. You can possibly have several modules with free standing functions with same signature which will match UFCS - how one may determine in general case which one to check against? Only way is to locally clone imports from the scope `Implements` is called from and I am not aware of any mechanism to do it. Well, one can always switch to string mixins of course and invade caller scope but that is not clean by any means.
Sep 04 2013
prev sibling parent reply Rory McGuire <rjmcguire gmail.com> writes:
So the general idea would be to add:

mixin("import "~ mod ~";");

into the check() inner function but mod needs to come from somewhere.

I haven't been able to make it as a template yet.
A template should get evaluated in the calling context.


On Wed, Sep 4, 2013 at 10:44 AM, Rory McGuire <rjmcguire gmail.com> wrote:

 yes, it does seem to break if the Implements template func is in a
 different module to the free standing func.

 hmph, how to get around that.


 On Wed, Sep 4, 2013 at 9:04 AM, Tobias Pankrath <tobias pankrath.net>wrote:

 On Wednesday, 4 September 2013 at 00:56:55 UTC, Rory McGuire wrote:

 I was wondering if its possible to do interfaces the way #golang does it
 but in #dlang.

 Here is my first try:
https://gist.github.com/**rjmcguire/6431542<https://gist.github.com/rjmcguire/6431542>
 .
  Any help on making this smaller would be awesome.

 Cheers,
 R
Will this break, if I implement the free standing functions in a different module that is not in scope of the Implements! template?
Sep 04 2013
parent reply "Dicebot" <public dicebot.lv> writes:
On Wednesday, 4 September 2013 at 08:56:10 UTC, Rory McGuire 
wrote:
 A template should get evaluated in the calling context.
No, in D templates use declaration scope (unless they are template mixins).
Sep 04 2013
parent reply Rory McGuire <rjmcguire gmail.com> writes:
thanks, yes, I just found that in TDPL. knew it was templates but forgot
about template mixins.

Do you know how to get a default parameter like __MODULE__ or __LINE__ to
be used from the calling site?
I've tried but I think my DMD is broken because it doesn't even work when I
subclass Exception().


On Wed, Sep 4, 2013 at 11:02 AM, Dicebot <public dicebot.lv> wrote:

 On Wednesday, 4 September 2013 at 08:56:10 UTC, Rory McGuire wrote:

 A template should get evaluated in the calling context.
No, in D templates use declaration scope (unless they are template mixins).
Sep 04 2013
parent reply "Dicebot" <public dicebot.lv> writes:
On Wednesday, 4 September 2013 at 09:23:44 UTC, Rory McGuire 
wrote:
 thanks, yes, I just found that in TDPL. knew it was templates 
 but forgot
 about template mixins.

 Do you know how to get a default parameter like __MODULE__ or 
 __LINE__ to
 be used from the calling site?
 I've tried but I think my DMD is broken because it doesn't even 
 work when I
 subclass Exception().
Special tokens like __LINE__ in default parameters are evaluated at the call site: http://dpaste.dzfl.pl/f7b9dfcf It does not help though, because you don't need __MODULE__ of the call site, you need list of modules it has imported in exact call scope.
Sep 04 2013
next sibling parent Rory McGuire <rjmcguire gmail.com> writes:
Thanks, the exact example is exceptions. Was working really late the day
that it wasn't working :D my bad. The following is what I was after, which
I really thought I had tried.

class BaseException : Exception {
    this(string s="", string file = __FILE__, int line = __LINE__) {
        super(s, file, line);
    }
}


On Wed, Sep 4, 2013 at 11:33 AM, Dicebot <public dicebot.lv> wrote:

 On Wednesday, 4 September 2013 at 09:23:44 UTC, Rory McGuire wrote:

 thanks, yes, I just found that in TDPL. knew it was templates but forgot
 about template mixins.

 Do you know how to get a default parameter like __MODULE__ or __LINE__ to
 be used from the calling site?
 I've tried but I think my DMD is broken because it doesn't even work when
 I
 subclass Exception().
Special tokens like __LINE__ in default parameters are evaluated at the call site: http://dpaste.dzfl.pl/f7b9dfcf It does not help though, because you don't need __MODULE__ of the call site, you need list of modules it has imported in exact call scope.
Sep 04 2013
prev sibling parent reply Rory McGuire <rjmcguire gmail.com> writes:
I have a basic solution but it can't handle basic types LOL! you have to
typedef them so that moduleName!T works.

and then the functions  have to be declared in the same module as the type.
Or alternatively you have to specify the module to use e.g.
Implements!(T,MyInterface, "mymodule").

http://dpaste.dzfl.pl/cff0ca5a

I had to hard code the module name because dmd segfaults if you use
__MODULE__ in the contraint. Both references to asdf should be changed to
the module you are using.




On Wed, Sep 4, 2013 at 11:48 AM, Rory McGuire <rjmcguire gmail.com> wrote:

 Thanks, the exact example is exceptions. Was working really late the day
 that it wasn't working :D my bad. The following is what I was after, which
 I really thought I had tried.

 class BaseException : Exception {
     this(string s="", string file = __FILE__, int line = __LINE__) {
         super(s, file, line);
     }
 }


 On Wed, Sep 4, 2013 at 11:33 AM, Dicebot <public dicebot.lv> wrote:

 On Wednesday, 4 September 2013 at 09:23:44 UTC, Rory McGuire wrote:

 thanks, yes, I just found that in TDPL. knew it was templates but forgot
 about template mixins.

 Do you know how to get a default parameter like __MODULE__ or __LINE__ to
 be used from the calling site?
 I've tried but I think my DMD is broken because it doesn't even work
 when I
 subclass Exception().
Special tokens like __LINE__ in default parameters are evaluated at the call site: http://dpaste.dzfl.pl/f7b9dfcf It does not help though, because you don't need __MODULE__ of the call site, you need list of modules it has imported in exact call scope.
Sep 04 2013
parent reply "Dicebot" <public dicebot.lv> writes:
On Wednesday, 4 September 2013 at 10:33:26 UTC, Rory McGuire 
wrote:
 I have a basic solution but it can't handle basic types LOL! 
 you have to
 typedef them so that moduleName!T works.
Of course it can't, built-in types don't have any owning module, those are not symbols. Why would you want to care about basic types anyway?
Sep 04 2013
parent reply Rory McGuire <rjmcguire gmail.com> writes:
yip, :) can't think of a reason except it was interesting. wish dmd didn't
segfault when I used __MODULE__.

on the plus side the requirement for a non basic type is the same
requirement that #golang has on its interfaces.




On Wed, Sep 4, 2013 at 12:48 PM, Dicebot <public dicebot.lv> wrote:

 On Wednesday, 4 September 2013 at 10:33:26 UTC, Rory McGuire wrote:

 I have a basic solution but it can't handle basic types LOL! you have to
 typedef them so that moduleName!T works.
Of course it can't, built-in types don't have any owning module, those are not symbols. Why would you want to care about basic types anyway?
Sep 04 2013
parent reply Jacob Carlborg <doob me.com> writes:
On 2013-09-04 13:01, Rory McGuire wrote:
 yip, :) can't think of a reason except it was interesting. wish dmd
 didn't segfault when I used __MODULE__.

 on the plus side the requirement for a non basic type is the same
 requirement that #golang has on its interfaces.
Do you have a module declaration? -- /Jacob Carlborg
Sep 04 2013
parent reply Rory McGuire <rjmcguire gmail.com> writes:
Thanks! a module declaration gets around that one.
http://dpaste.dzfl.pl/cff0ca5a line 21


On Wed, Sep 4, 2013 at 1:18 PM, Jacob Carlborg <doob me.com> wrote:

 On 2013-09-04 13:01, Rory McGuire wrote:

 yip, :) can't think of a reason except it was interesting. wish dmd
 didn't segfault when I used __MODULE__.

 on the plus side the requirement for a non basic type is the same
 requirement that #golang has on its interfaces.
Do you have a module declaration? -- /Jacob Carlborg
Sep 04 2013
parent Jacob Carlborg <doob me.com> writes:
On 2013-09-04 13:57, Rory McGuire wrote:
 Thanks! a module declaration gets around that one.
 http://dpaste.dzfl.pl/cff0ca5a line 21
I think this should already be fixed in git HEAD. -- /Jacob Carlborg
Sep 04 2013