Revised RFC on range design for D2

Don nospam at nospam.com.au
Mon Sep 29 11:35:55 PDT 2008


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.


More information about the Digitalmars-d-announce mailing list