Jeremie Pelletier wrote:
Andrei Alexandrescu wrote:
Justin Johansson wrote:
For the interest of newsgroups readers, I dropped in at the Cafe the
other day and
the barista had this to say
http://cafe.elharo.com/programming/imagine-theres-no-null/
Disclaimer: YMMV
Cheers
-- Justin Johansson
This article brings up a very interesting point that beats Walter's
argument to a pulp, then puts salt on it.
Walter's overriding argument (I'm sure you know it, he repeated it
claiming nobody understands it until we learned it by heart) was: "I
don't want the compiler to require a value there! People will just put
some crappy value in to get the code to compile, and the code with
errors in it will soldier on instead of duly crashing! How is that
better???" etc.
Yet D has structs.
Walter knows D has structs, and knows how D structs operate. He put
structs in D because he thought structs, vegetables, exercising, and
flossing are good for you.
We all know a serving of structs a day makes for healthy programmers!
Yet structs operate the exact way that Walter claim is pernicious.
Structs don't have a singular null value and always are nominally
valid objects.
You're comparing value types to reference types. A class object is also
always valid, its the reference that can be null by pointing to no
object. You would have the same semantics by using struct pointers.
Yet I've never heard Walter continuing his argument with "Just look at
those stinky structs. It must be a million times I had a bug caused by
the absence of null structs! I just had to put a crappy struct there
in my code, and my code soldiered on in error instead of crashing!"
I never pass structs by value in D, except for returns because of RVO,
so I can get a null struct pointer sometimes, but thats what contracts
and backtraces are for. If my code was still executing on an invalid
struct reference it would be much, much harder to pinpoint the origin of
the bug.
Why didn't he continue his argument that way? And why didn't anybody
else continue his argument that way? Because nobody has had such a
problem. Everybody uses structs, and everybody's happy about them
lacking null.
Once again, structs are value types.
To complete the irony, Walter and I discussed a while ago about
structs and .init values. We concluded that D, at least for the time
being, will allow struct construction without any code invocation, by
just bitcopying the .init value of the struct over. He was very happy
about that because a lot of code generation got majorly simplified
that way. (I was less happy because that meant less user control over
struct construction.) So Walter was happy that he had for structs a
feature he thinks is amazingly dangerous for classes.
Classes have an initializer too, it's just copied by the GC after
allocation instead.
So I don't think Walter's argument is invalid, I think it simply
doesn't exist. This post made it disappear.
Andrei
I disagree, you compared apples to oranges here. Correct me if I'm
wrong, but I don't think we should base an argument over reference types
by using value types.
Jeremie
Save for address taking, value types are indistinguishable from
immutable reference types. Value types don't have a null and that
doesn't seem to make them unusable. It's a simple point.
Andrei