June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozák | On Friday, 19 June 2015 at 14:04:05 UTC, Daniel Kozák wrote:
>
> On Fri, 19 Jun 2015 13:52:52 +0000
> Quentin Ladeveze via Digitalmars-d-learn
> <digitalmars-d-learn@puremagic.com> wrote:
>
>> On Friday, 19 June 2015 at 13:38:45 UTC, Steven Schveighoffer wrote:
>> >
>> > Does this work for you, or is there a further expectation?
>> >
>> > auto asTuple() { return Tuple!(int, "a", ...)(a, b, stringValue);}
>> >
>> > -Steve
>>
>> In fact, I was trying to use traits to create the tuple
>> automatically and being able to add or remove methods to the
>> struct without breaking the asTuple method.
>> I used allMembers for the name of the methods, but I didn't found
>> anything for their return types or their values.
>>
>> Thank you.
> http://dlang.org/phobos/std_traits.html#ReturnType http://dlang.org/phobos/std_traits.html#ParameterTypeTuple
These are interesting and can be useful, but allMembers returns strings and not functions, so I can't apply ReturnType.
|
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Baz | On 6/19/15 10:01 AM, Baz wrote:
> On Friday, 19 June 2015 at 13:52:54 UTC, Quentin Ladeveze wrote:
>> On Friday, 19 June 2015 at 13:38:45 UTC, Steven Schveighoffer wrote:
>>>
>>> Does this work for you, or is there a further expectation?
>>>
>>> auto asTuple() { return Tuple!(int, "a", ...)(a, b, stringValue);}
>>>
>>> -Steve
>>
>> In fact, I was trying to use traits to create the tuple automatically
>> and being able to add or remove methods to the struct without breaking
>> the asTuple method.
>> I used allMembers for the name of the methods, but I didn't found
>> anything for their return types or their values.
>>
>> Thank you.
>
> when the return type is defined inside the function it's called a
> 'Voldemort type',
> see http://www.drdobbs.com/cpp/voldemort-types-in-d/232901591?pgno=2
Actually, this isn't a voldemort type, because the type can be named outside the function.
-Steve
|
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Quentin Ladeveze | On 6/19/15 10:13 AM, Quentin Ladeveze wrote:
> On Friday, 19 June 2015 at 14:04:05 UTC, Daniel Kozák wrote:
>>
>> On Fri, 19 Jun 2015 13:52:52 +0000
>> Quentin Ladeveze via Digitalmars-d-learn
>> <digitalmars-d-learn@puremagic.com> wrote:
>>
>>> On Friday, 19 June 2015 at 13:38:45 UTC, Steven Schveighoffer wrote:
>>> >
>>> > Does this work for you, or is there a further expectation?
>>> >
>>> > auto asTuple() { return Tuple!(int, "a", ...)(a, b, > stringValue);}
>>> >
>>> > -Steve
>>>
>>> In fact, I was trying to use traits to create the tuple
>>> automatically and being able to add or remove methods to the
>>> struct without breaking the asTuple method.
>>> I used allMembers for the name of the methods, but I didn't found
>>> anything for their return types or their values.
>>>
>>> Thank you.
>> http://dlang.org/phobos/std_traits.html#ReturnType
>> http://dlang.org/phobos/std_traits.html#ParameterTypeTuple
>
> These are interesting and can be useful, but allMembers returns strings
> and not functions, so I can't apply ReturnType.
It's a *compile time* string. D is able to do some amazing things with this :)
// assuming 'a' is the first member
mixin("alias aReturnType = ReturnType!(Example." ~ __traits(allMembers, Example)[0] ~ ");");
static assert(is(aReturnType == int));
Using foreach over allMembers, you can construct a perfect return tuple using introspection and mixin.
-Steve
|
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Quentin Ladeveze | On Fri, 19 Jun 2015 13:27:13 +0000, Quentin Ladeveze wrote: > > Is there any way to have a asTuple method in this struct that would returns something like : > > Tuple!(int, "a", float, "b", string, "c") > > and that will contain the values of the methods of the struct ? > > Thanks. You'll want to work your way through this example carefully as it's basically template-based functional programming, but I think does what you want: http://dpaste.dzfl.pl/b048ea3adb93 |
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Quentin Ladeveze | On Friday, 19 June 2015 at 14:13:46 UTC, Quentin Ladeveze wrote: >> [..] > These are interesting and can be useful, but allMembers returns strings and not functions, so I can't apply ReturnType. Here's my solution: http://dpaste.dzfl.pl/c69de3c16d75 |
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Friday, 19 June 2015 at 14:42:59 UTC, Steven Schveighoffer wrote:
> On 6/19/15 10:13 AM, Quentin Ladeveze wrote:
>> On Friday, 19 June 2015 at 14:04:05 UTC, Daniel Kozák wrote:
>>>
>>> On Fri, 19 Jun 2015 13:52:52 +0000
>>> Quentin Ladeveze via Digitalmars-d-learn
>>> <digitalmars-d-learn@puremagic.com> wrote:
>>>
>>>> On Friday, 19 June 2015 at 13:38:45 UTC, Steven Schveighoffer wrote:
>>>> >
>>>> > Does this work for you, or is there a further expectation?
>>>> >
>>>> > auto asTuple() { return Tuple!(int, "a", ...)(a, b, > stringValue);}
>>>> >
>>>> > -Steve
>>>>
>>>> In fact, I was trying to use traits to create the tuple
>>>> automatically and being able to add or remove methods to the
>>>> struct without breaking the asTuple method.
>>>> I used allMembers for the name of the methods, but I didn't found
>>>> anything for their return types or their values.
>>>>
>>>> Thank you.
>>> http://dlang.org/phobos/std_traits.html#ReturnType
>>> http://dlang.org/phobos/std_traits.html#ParameterTypeTuple
>>
>> These are interesting and can be useful, but allMembers returns strings
>> and not functions, so I can't apply ReturnType.
>
> It's a *compile time* string. D is able to do some amazing things with this :)
>
> // assuming 'a' is the first member
> mixin("alias aReturnType = ReturnType!(Example." ~ __traits(allMembers, Example)[0] ~ ");");
> static assert(is(aReturnType == int));
>
> Using foreach over allMembers, you can construct a perfect return tuple using introspection and mixin.
>
> -Steve
I would never have thought about mixins, this is amazing ! But thinking at compile time still is a little difficult for me, and now I don't understand how you can construct your tuple. I've been trying to create a string, by iterating on allMembers and concatenating the result of my functions in a string. But of course, I cannot use this string at compile time.
Now I know there is a way t do it, but my brain just can't figure it out.
Can you help me ?
|
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Justin Whear | On Friday, 19 June 2015 at 15:36:54 UTC, Justin Whear wrote:
> On Fri, 19 Jun 2015 13:27:13 +0000, Quentin Ladeveze wrote:
>>
>> Is there any way to have a asTuple method in this struct that would returns something like :
>>
>> Tuple!(int, "a", float, "b", string, "c")
>>
>> and that will contain the values of the methods of the struct ?
>>
>> Thanks.
>
> You'll want to work your way through this example carefully as it's
> basically template-based functional programming, but I think does what
> you want:
> http://dpaste.dzfl.pl/b048ea3adb93
This is interesting, thank you very much ! I will try to figure out how it works now
|
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to ZombineDev | On Friday, 19 June 2015 at 15:47:09 UTC, ZombineDev wrote:
> On Friday, 19 June 2015 at 14:13:46 UTC, Quentin Ladeveze wrote:
>>> [..]
>> These are interesting and can be useful, but allMembers returns strings and not functions, so I can't apply ReturnType.
>
> Here's my solution:
> http://dpaste.dzfl.pl/c69de3c16d75
Thank you very much, this solution is interesting too.
|
June 19, 2015 Re: Return types of the methods of a struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Quentin Ladeveze | On 6/19/15 12:09 PM, Quentin Ladeveze wrote: > On Friday, 19 June 2015 at 14:42:59 UTC, Steven Schveighoffer wrote: >> On 6/19/15 10:13 AM, Quentin Ladeveze wrote: >>> On Friday, 19 June 2015 at 14:04:05 UTC, Daniel Kozák wrote: >>>> >>>> On Fri, 19 Jun 2015 13:52:52 +0000 >>>> Quentin Ladeveze via Digitalmars-d-learn >>>> <digitalmars-d-learn@puremagic.com> wrote: >>>> >>>>> On Friday, 19 June 2015 at 13:38:45 UTC, Steven Schveighoffer wrote: >>>>> > >>>>> > Does this work for you, or is there a further expectation? >>>>> > >>>>> > auto asTuple() { return Tuple!(int, "a", ...)(a, b, > > >>>>> stringValue);} >>>>> > >>>>> > -Steve >>>>> >>>>> In fact, I was trying to use traits to create the tuple >>>>> automatically and being able to add or remove methods to the >>>>> struct without breaking the asTuple method. >>>>> I used allMembers for the name of the methods, but I didn't found >>>>> anything for their return types or their values. >>>>> >>>>> Thank you. >>>> http://dlang.org/phobos/std_traits.html#ReturnType >>>> http://dlang.org/phobos/std_traits.html#ParameterTypeTuple >>> >>> These are interesting and can be useful, but allMembers returns strings >>> and not functions, so I can't apply ReturnType. >> >> It's a *compile time* string. D is able to do some amazing things with >> this :) >> >> // assuming 'a' is the first member >> mixin("alias aReturnType = ReturnType!(Example." ~ >> __traits(allMembers, Example)[0] ~ ");"); >> static assert(is(aReturnType == int)); >> >> Using foreach over allMembers, you can construct a perfect return >> tuple using introspection and mixin. >> >> -Steve > > I would never have thought about mixins, this is amazing ! But thinking > at compile time still is a little difficult for me, and now I don't > understand how you can construct your tuple. I've been trying to create > a string, by iterating on allMembers and concatenating the result of my > functions in a string. But of course, I cannot use this string at > compile time. > > Now I know there is a way t do it, but my brain just can't figure it out. > > Can you help me ? The string must stay compile time. This means it must be calculated: 1. in a mixin statement Example is what I wrote earlier. 2. as an initializer to an immutable, enum, or non-local variable enum x = "Blah." ~ __traits(allMembers, Blah)[0]; // x is compile-time 3. inside a CTFE function. A CTFE function is just a normal runtime function with restrictions (see http://dlang.org/function.html#interpretation). But you must *call* it from a context like 1 or 2: string foo(string a, string b) { return a ~ b; } // foo is CTFEable auto x1 = foo("a", "b"); // x1 is a runtime string, foo is called at runtime enum x2 = foo("a", "b"); // x2 is a compile-time string, foo is executed at compile time (it is not called during execution of your program mixin("int " ~ x1 ~ ";"); // error, can't use runtime string x1 mixin("int " ~ x2 ~ ";"); // ok, declares int ab; mixin("int " ~ foo("c", "d") ~ ";"); // ok, declares int ab; Keep your code all executing at compile time, and you can use your strings to write your code for you! -Steve |
Copyright © 1999-2021 by the D Language Foundation