Revised RFC on range design for D2
Bruno Medeiros
brunodomedeiros+spam at com.gmail
Thu Oct 2 06:00:54 PDT 2008
Don wrote:
> Andrei Alexandrescu wrote:
>> Don wrote:
>>> Andrei Alexandrescu wrote:
>>>> Sergey Gromov wrote:
>>>>> In article <gbjihf$2803$1 at digitalmars.com>,
>>>>> frank at youknow.what.todo.interNETz says...
>>>>>> Andrei Alexandrescu wrote:
>>>>>>> Steven Schveighoffer wrote:
>>>>>>>> You are assuming that the C language decision to require
>>>>>>>> parentheses for all functions was a design mistake. I would
>>>>>>>> argue that the design was on purpose and correctly served that
>>>>>>>> purpose. The purpose was to remove ambiguity when faced with
>>>>>>>> understanding code without all the context.
>>>>>>> I have stated my assumption and its basis. What is the basis of
>>>>>>> yours?
>>>>>> Yum. I think the problem is that when C was designed, K&R didn't
>>>>>> consider
>>>>>> the use of classes with properties using getter and setter methods.
>>>>>> Therefore, it made sense to have the naked function name denote the
>>>>>> function pointer, and make braces following an identifier the mark
>>>>>> of a
>>>>>> function call. I initially had some trouble accepting the explicit
>>>>>> & in D
>>>>>> to get the function pointer myself.
>>>>>> I wouldn't go so far as to call that property of C a design
>>>>>> mistake in
>>>>>> light of the actual intensions of K&R. But I definitely would defend
>>>>>> the choice of a language designer to change that feature in light of
>>>>>> more modern programming paradigms.
>>>>>
>>>>> Functions in D are first-class values. It's awkward that a
>>>>> first-class value cannot be accessed by its identifier.
>>>>
>>>> I agree. But then use of functions for invocation dwarfs use of
>>>> functions as first-class values, so I think requiring & for the latter
>>>> is a sensible engineering decision.
>>>
>>>
>>> By the way, D supports declarations of function type (not function
>>> pointer), though it's not documented in the spec. They always struck
>>> me as a really odd feature in C, and they're pretty confusing for
>>> newbies:
>>>
>>> typedef void Func(int);
>>>
>>> Then you get oddities
>>>
>>> Func * f = &foo; // OK.
>>>
>>> Func f = foo; // You might expect this to work, but it makes no sense.
>>>
>>> This is a case where you do not intuitively expect "foo" (with no &)
>>> to be a function pointer. You might as well make it a function
>>> invocation.
>>>
>>> It's pretty interesting to fool around with these fellas in an is()
>>> expression.
>>
>> Heh. That is eerily similar to the way C handles it - here's an example:
>>
>> // this is C
>> typedef void foo(int);
>>
>> int main()
>> {
>> foo bar;
>> foo baz;
>> bar = baz;
>> }
>>
>> The typedef goes through. The definitions of bar and baz go through
>> (and are simply equivalent to an extern declaration!!!) The assignment
>> won't go through because, bar is not an lvalue.
>
> Is there a use case for this? I've only ever found it to be a nuisance,
> or a curiosity at best. It seems like a great bit of C baggage to discard.
What exactly are you trying to discard? Just the
typedef void foo(int);
syntax? Or any typedef of a function type? Like
void func(int);
typedef typeof(func) foo;
?
--
Bruno Medeiros - Software Developer, MSc. in CS/E graduate
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D
More information about the Digitalmars-d-announce
mailing list