Null references redux

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Sep 27 14:55:55 PDT 2009


Michel Fortin wrote:
> On 2009-09-27 09:41:03 -0400, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> said:
> 
>> Michel Fortin wrote:
>>> On 2009-09-26 23:28:30 -0400, Michel Fortin 
>>> <michel.fortin at michelf.com> said:
>>>
>>>> On 2009-09-26 22:07:00 -0400, Walter Bright 
>>>> <newshound1 at digitalmars.com> said:
>>>>
>>>>> [...] The facilities in D enable one to construct a non-nullable 
>>>>> type, and they are appropriate for many designs. I just don't see 
>>>>> them as a replacement for *all* reference types.
>>>>
>>>> As far as I understand this thread, no one here is arguing that 
>>>> non-nullable references/pointers should replace *all* 
>>>> reference/pointer types. The argument made is that non-nullable 
>>>> should be the default and nullable can be specified explicitly any 
>>>> time you need it.
>>>>
>>>> So if you need a reference you use "Object" as the type, and if you 
>>>> want that reference to be nullable you write "Object?". The static 
>>>> analysis can then assert that your code properly check for null 
>>>> prior dereferencing a nullable type and issues a compilation error 
>>>> if not.
>>>
>>> I just want to add: some people here are suggesting the compiler adds 
>>> code to check for null and throw exceptions... I believe like you 
>>> that this is the wrong approach because, like you said, it makes 
>>> people add dummy try/catch statements to ignore the error. What you 
>>> want a prorammer to do is check for null and properly handle the 
>>> situation before the error occurs, and this is exactly what the 
>>> static analysis approach I suggest forces.
>>>
>>> Take this example where "a" is non-nullable and "b" is nullable:
>>>
>>> string test(Object a, Object? b)
>>> {
>>>     auto x = a.toString();
>>>     auto y = b.toString();
>>>         return x ~ y;
>>> }
>>>
>>> This should result in a compiler error on line 4 with a message 
>>> telling you that "b" needs to be checked for null prior use. The 
>>> programmer must then fix his error with an if (or some other control 
>>> structure), like this:
>>>
>>> string test(Object a, Object? b)
>>> {
>>>     audo result = a.toString();
>>>     if (b)
>>>         result ~= b.toString();
>>>
>>>     return result;
>>> }
>>>
>>> And now the compiler will let it pass. This is what I'd like to see. 
>>> What do you think?
>>>
>>> I'm not totally against throwing exceptions in some cases, but the 
>>> above approach would be much more useful. Unfortunatly, throwing 
>>> exceptions it the best you can do with a library type approach.
>>
>> I don't think this would fly.
> 
> You want me to add wings? Please explain.

I did explain. You suggest that we replace an automated, no-cost 
checking with a manual, compulsory, conservative, and costly scheme. 
That pretty much summarizes its disadvantages too :o).

Andrei



More information about the Digitalmars-d mailing list