On 11/19/2017 11:36 AM, Timon Gehr wrote:
On 19.11.2017 05:04, Walter Bright wrote:
On 11/18/2017 6:25 PM, Timon Gehr wrote:
I.e., baseClass should have type Nullable!ClassDeclaration. This does not in any form imply that ClassDeclaration itself needs to have a null value.

Converting back and forth between the two types doesn't sound appealing.
...

I can't see the problem. You go from nullable to non-nullable by checking for null, and the other direction happens implicitly.

Implicit conversions have their problems with overloading, interactions with const, template argument deduction, surprising edge cases, probably breaking a lot of Phobos, etc. It's best not to layer on more of this stuff. Explicit casting is a problem, too.

There's also an issue of how to derive a class from a base class.


What should the default initializer for a type do?
There should be none for non-nullable types.
I suspect you'd wind up needing to create an "empty" object just to satisfy that requirement. Such as for arrays of objects, or objects with a cyclic graph.
Again, just use a nullable reference if you need null. The C# language change makes the type system strictly more expressive. There is nothing that cannot be done after the change that was possible before, it's just that the language allows to document and verify intent better.

This implies one must know all the use cases of a type before designing it.


Yes, my own code has produced seg faults from erroneously assuming a value was not null. But it wouldn't have been better with non-nullable types, since the logic error would have been hidden

It was your own design decision to hide the error.

No, it was a bug. Nobody makes design decisions to insert bugs :-) The issue is how easy the bug is to have, and how difficult it would be to discover it.


and may have been much, much harder to recognize and track down.
No, it would have been better because you would have been used to the more explicit system from the start and you would have just written essentially the same code with a few more compiler checks in those cases where they apply, and perhaps you would have suffered a handful fewer null dereferences.

I'm just not convinced of that.


The point of types is to classify values into categories such that types in the same category support the same operations. It is not very clean to have a special null value in all those types that does not support any of the operations that references are supposed to support. Decoupling the two concepts into references an optionality gets rid of this issue, cleaning up both concepts.

I do understand that point. But I'm not at all convinced that non-nullable types in aggregate results in cleaner, simpler code, for reasons already mentioned.

I wish there was a null for int types.
AFAIU, C# will now have 'int?'.

Implemented as a pointer to int? That is indeed one way to do it, but rather 
costly.


It can also be pretty annoying.

Yes, it can be annoying, so much better to have a number that looks like it might be right, but isn't, because 0.0 was used as a default initializer when it should have been 1.6. :-)


It really depends on the use case. Also this is in direct contradiction with your earlier points. NaNs don't usually blow up.

"blow up" - as I've said many times, I find the visceral aversion to seg faults puzzling. Why is that worse than belatedly discovering a NaN in your output, which you now have to back search it to its source?

My attitude towards programming bugs is to have them immediately halt the program as soon as possible, so:

1. I know an error has occurred, i.e. I don't get corrupt results that I assumed were correct, leading to more adverse consequences
2. The detection of the error is as close as possible to where things went wrong

Having floats default initialize to 0.0 is completely anti-ethical to (1) and (2), and NaN at least addresses (1).

There have been many long threads on this topic in this forum. Yes, I understand that it's better for game programs to ignore bugs because gamers don't care about corrupt results, they only care that the program continues to run and do something. For the rest of us, are we ready to be done with malware inserted via exploitable bugs?

By the way, I was initially opposed to having seg faults produce stack traces, saying it was the debugger's job to do that. I've since changed my mind. I do like very much the convenience of the stack trace dump, and rely on it all the time. I even insert code to force a seg fault to get a stack trace. I was wrong about its utility.


I'm not fighting for explicit nullable in D by the way.

Thanks for clarifying that.

Reply via email to