Alternate declaration syntax
Hans W. Uhlig
huhlig at gmail.com
Sun Apr 13 10:40:29 PDT 2008
Koroskin Denis wrote:
> On Sun, 13 Apr 2008 12:07:11 +0400, Georg Wrede <georg at nospam.org> wrote:
>> Hans W. Uhlig wrote:
>>> I would think something similar to perl would work
>>> {var1, var2, var3} = blah(1,2,3);
>>> {int var1, string var2, object var3} = blah(1,2,3);
>>> const blah(int a, int b, int c) returns const int, invariant string,
>>> object {
>>> return 1, "hello", this;
>>> }
>>
>> Well, at first sight, this looks nice.
>
> Doesn't look nice to me. Look at this:
>
> auto t = 1, "hello", this;
>
> What it the t.typeof? Do you think it's {int, string, this.typeof}?
> No, it's just this.typeof, because comma is a statement separator in
> this context.
> Moreover, I don't think this is consistent:
>
> int i;
> string s;
> this.typeof t;
>
> {i, s, t} = 1, "hello", this;
>
> Compare to:
> {i, s, t} = {1, "hello, "this};
>
> or to:
> [i, s, t] = [1, "hello", this];
>
> Anyway, I don't like {} syntax much. I believe, in D it denotes scopes.
> Even array initialization moved from C style {1, 2, 3} to D style [1, 2,
> 3].
>
> To me, tuples aren't different from arrays. And I would like to operate
> on them like on arrays:
>
> auto t = [1, "hello", this];
> auto s = t[0..1]; // s == {1, "hello" }. t{0..1} looks like an ugly
> language hack to me.
>
> Or like this:
>
> {int, int, string} k = [1, 2, "3"];
> k[0..1] = [1, 1]; // here it is. What is the type of [1, 1]? I don't
> care!
> int[2] i = k[0..1]; // Arrays should be convertible to tuples and
> vice-versa
[] would fit the paradime anyhow. Perl actually uses (x,y,z) = (a,b,c);
so using [a,b,c] I thin k would work fine. As for initialization inside
a "touple bracket" I think it should be eigther allowed only with auto
(at which point the compiler should effectively treat each variable as a
seperate statement, i.E.
(auto i, j, k) = blah();
auto i = blah()[0];
j = blah()[1];
k = blah()[2];
since as I understand it, a touple is effectively an anonymous array
return a,b,c; becomes
void * touplereturn[] = [&a, &b, &c];
return touplereturn;
at which point you simply retreive the resulting array and process
perhaps this is where some native(rather then library) array
handling/dereferencing might be appropriate.
when using standard vs touple syntax, if Walter wants to avoid the
suggested syntax as being too pascal like
touple foobar(int a, int b, int c) returns int, double, string {}
such that touple is an array reference containing references, and the
compiler then looks to the property returns for the return types.
However, at least in my mind this is a horrendous cluge but still
providdes the neccessary type checking and compiler enforcement.
while I think this is a hack and leads to more confusion it would
provide a bit more readability then otherwise would be gained.
so, in short, my vote for the declaration statement moves to the end of
the line
function <identifier>(<<parameter modifier, ...> parameter, ...>)
returns <<return modifier> return type, ...> { // block
returns [x,y,z]; or returns x,y,z;
returns [x]; or returns x;
}
[x,y,z] = foo();
[auto x, auto y, z] = foo();
comments?
More information about the Digitalmars-d
mailing list