November 01, 2008
Andrei Alexandrescu wrote:
> I've been thinking of defining a simple function that binds to variable addresses and allows assignment from a tuple, in which case the code would be:
> 
> group(&code, &msg) = getError;
> 
> In "the future" we'll have variadic ref arguments, in which case the "&"s can be dropped:
> 
> group(code, msg) = getError;

I've managed to make this work right now:
	group!(code, msg) = getError();

as well as (with a different function):
	group_!(code, msg) = getError();
	auto myGroup = group_!(code, msg);
	myGroup = getError();
(The second example has several implementations in fact. Unfortunately,
all of them currently allocate a closure for the variables if they're
local. The first one doesn't have that problem)

All of this is D2+Phobos, by the way. Though something similar could likely be made in D1 (minus the closure issues, obviously).


Unfortunately it does have a severe limitation: it only works on
straight variables because it uses alias template parameters.
You can't assign to *b or foo.a, for instance (unless it's static).

See attachment for code.


November 01, 2008
Frits van Bommel:
> I've managed to make this work right now:
[...]

Take a look at the Record!(), record in my libs (for D1), in modules templates
 and func
http://www.fantascienza.net/leonardo/so/libs_d.zip

Bye,
bearophile
November 01, 2008
bearophile wrote:
> Frits van Bommel:
>> I've managed to make this work right now:
> [...]
> 
> Take a look at the Record!(), record in my libs (for D1), in modules templates
>  and func
> http://www.fantascienza.net/leonardo/so/libs_d.zip

Is there a link to online documentation?

Andrei
November 01, 2008
Andrei Alexandrescu:
> Is there a link to online documentation?

Yes, there is (only because you are one of the most gentle persons of this newsgroup): http://www.fantascienza.net/leonardo/so/dlibs/all.html

The form of that page will improve later.

Bye,
bearophile
November 03, 2008
Denis Koroskin wrote:
> On Sat, 01 Nov 2008 19:33:01 +0300, Andrei Alexandrescu <SeeWebsiteForEmail@erdani.org> wrote:
> 
>> Denis Koroskin wrote:
>>> On Sat, 01 Nov 2008 19:04:16 +0300, Andrei Alexandrescu <SeeWebsiteForEmail@erdani.org> wrote:
>>>
>>>> KennyTM~ wrote:
>>>>> ore-sama wrote:
>>>>>> 4tuu4k002@sneakemail.com Wrote:
>>>>>>
>>>>>>> 105  Multiple return values (tuples (#28)
>>>>>>> int, int getPoint();
>>>>>>> int a,b;
>>>>>>> a,b = getPoint();
>>>>>>
>>>>>> Provided we have lvalue array literals, this can fit to general
>>>>>> array operations rules:
>>>>>> int[] getPoint();
>>>>>> int a,b;
>>>>>> [a,b]=getPoint();
>>>>>  int code;
>>>>> string msg;
>>>>>  [code, msg] = getError();
>>>>
>>>> Tuple!(int, "code", string, "msg") getError();
>>>> auto e = getError;
>>>>
>>>>
>>>> Andrei
>>>  Imagine 'code' and 'msg' are already there as local variables and
>>> you want to reuse them. How should you do this?
>>
>> I've been thinking of defining a simple function that binds to variable addresses and allows assignment from a tuple, in which case the code would be:
>>
>> group(&code, &msg) = getError;
>>
>> In "the future" we'll have variadic ref arguments, in which case the "&"s can be dropped:
>>
>> group(code, msg) = getError;
>>
>> Also in "the future" variable definitions will be expressions, in which case the code to define and assign code and msg becomes:
>>
>> group(int code, string msg) = getError;
>>
>>
>> Andrei
> 
> Hmmm, this is almost as nice (inspired by jQuery):
> 
> $(code, msg) = getError(); // :)

Sure.

$ is not an identifier, but this will work.

import tools.base;

alias ptuple _;

Stuple!(int, string) test() { return stuple(4, "foo"); }

void main() { int a; string b; _(a, b) = test(); }

:)
November 03, 2008
downs wrote:
> Denis Koroskin wrote:
>> On Sat, 01 Nov 2008 19:33:01 +0300, Andrei Alexandrescu
>> <SeeWebsiteForEmail@erdani.org> wrote:
>>
>>> Denis Koroskin wrote:
>>>> On Sat, 01 Nov 2008 19:04:16 +0300, Andrei Alexandrescu
>>>> <SeeWebsiteForEmail@erdani.org> wrote:
>>>>
>>>>> KennyTM~ wrote:
>>>>>> ore-sama wrote:
>>>>>>> 4tuu4k002@sneakemail.com Wrote:
>>>>>>>
>>>>>>>> 105  Multiple return values (tuples (#28)
>>>>>>>> int, int getPoint();
>>>>>>>> int a,b;
>>>>>>>> a,b = getPoint();
>>>>>>> Provided we have lvalue array literals, this can fit to general
>>>>>>> array operations rules:
>>>>>>> int[] getPoint();
>>>>>>> int a,b;
>>>>>>> [a,b]=getPoint();
>>>>>>  int code;
>>>>>> string msg;
>>>>>>  [code, msg] = getError();
>>>>> Tuple!(int, "code", string, "msg") getError();
>>>>> auto e = getError;
>>>>>
>>>>>
>>>>> Andrei
>>>>  Imagine 'code' and 'msg' are already there as local variables and
>>>> you want to reuse them. How should you do this?
>>> I've been thinking of defining a simple function that binds to
>>> variable addresses and allows assignment from a tuple, in which case
>>> the code would be:
>>>
>>> group(&code, &msg) = getError;
>>>
>>> In "the future" we'll have variadic ref arguments, in which case the
>>> "&"s can be dropped:
>>>
>>> group(code, msg) = getError;
>>>
>>> Also in "the future" variable definitions will be expressions, in
>>> which case the code to define and assign code and msg becomes:
>>>
>>> group(int code, string msg) = getError;
>>>
>>>
>>> Andrei
>> Hmmm, this is almost as nice (inspired by jQuery):
>>
>> $(code, msg) = getError(); // :)
> 
> Sure.
> 
> $ is not an identifier, but this will work.
> 
> import tools.base;
> 
> alias ptuple _;
> 
> Stuple!(int, string) test() { return stuple(4, "foo"); }
> 
> void main() { int a; string b; _(a, b) = test(); }
> 
> :)

$(a, b);
_(a, b);

*has flashbacks to his days in the jungles of Perl*
1 2
Next ›   Last »