[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: simply question about syntatic sugar
- From: Nagaev Boris <bnagaev@...>
- Date: Sun, 7 Jun 2015 21:45:32 +0000
On Sun, Jun 7, 2015 at 8:17 PM, Sean Conner <sean@conman.org> wrote:
> It was thus said that the Great Soni L. once stated:
>> >On Sun, Jun 7, 2015 at 1:38 PM, Soni L. <fakedme@gmail.com> wrote:
>> >>
>> >>Here's better syntactic sugar:
>> >>
>> >>v->abs = v:abs()
>> >>
>> >>(in C, -> is like . but with a dereference, "dereference" being the key
>> >>here)
>> >>
>> >Why not
>> > v\abs!
>> >?
>> >
>> >It is the moonscript syntax.
>>
>> But -> is something a C coder is used to.
>
> And something some C coders (like me) hate. It doesn't need to exist at
> all. Take, for instance:
>
> struct foo
> {
> int a;
> int b;
> int c;
> } foo;
> int bar[3];
>
> foo and bar will have the same layout in memory (and be the same size).
> And to reference the second int:
>
> int a = foo.b;
> int b = bar[1];
>
> The difference in syntax here is because the two are conceptually
> different. foo is a structure and the fields can be of different types.
> bar is an array, where each element is of the same type. Now, let's mix
> things up a bit with pointers:
>
> foo *pf = &foo;
> int *pb = bar;
>
> Right off the bat, you'll notice something a bit different. Why isn't the
> second line:
>
> int *pb = &bar; /* ? */
>
> But before I answer that, let's grab the second int through the pointers:
>
> int c = pf->b;
> int d = pb[1];
>
> Wait ... what? If pointers were treated more consistently, then you would
> expect either ...
>
> foo *pf = foo; /* personally, I prefer this style */
> int *pb = bar;
>
> int c = pf.b;
> int d = pb[1];
>
> or
>
> foo *pf = &foo;
> int *pb = &bar;
>
> int c = pf->b;
> int d = pb->[1];
>
> So, if C (or rather, the C compilers) can tell the difference between an
> array and a pointer to an array and still use the same syntax, then it
> should be just as easy (or the same) for C (or rather, the C compiler) to
> tell the difference between a struct and a pointer to a struct and use the
> same syntax. The only reason we have what we have now is historical [1][2].
>
If C used "." to dereference a pointer and get a field from a
structure, it would be incompatible with C++. C++ allows overriding
"->", which allows smart pointers and iterators. C++ compiler would
not tell the difference between smart pointer's methods and methods of
pointed value. It is impossible to override "." in C++.
C would be better and cleaner language if array type removed in favor
of pointers.
void bar(int[] foo); --> void bar(int* foo);
A variable created by static array declaration would be a pointer.
sizeof(array) would not work, well and good -- it is too easy to make
an error using this feature.
> -spc (Who would prefer that -> never had existed in C)
>
> [1] http://stackoverflow.com/questions/13366083/why-does-the-arrow-operator-in-c-exist/13366168#13366168
>
> [2] K&R could probably have fixed it, but they already had 10 users ... [3]
>
> [3] It's a joke. Laugh, son! Laugh! [4]
>
> [4] Okay, I'll explain. It's a reference to make and why we are still
> forced to use tabs in makefiles. By the time the author realized
> his mistake, he already had 10 users ...
>
>
--
Best regards,
Boris Nagaev