Proposal : allocations made easier with non nullable types.

Alex Burton alexibu at mac.com
Mon Feb 9 19:14:20 PST 2009


Daniel Keep Wrote:

> 
> 
> Alex Burton wrote:
> > Daniel Keep Wrote:
> > 
> >>
> >> Alex Burton wrote:
> >>> I think it makes no sense to have nullable pointers in a high level language like D.
> >> Oh, and how do you intend to make linked lists?  Or trees?  Or any
> >> non-trivial data structure?
> > 
> > I am not saying than null pointers should be barred - I don't think it would be possible.
> > To implement the above, in a tree you will probably have arrays of pointers, each element of the array should be a valid pointer, and never null.
> > To implement a linked list, I agree that a null pointer is a good implementation. You could still have the X * x = 0; pointer syntax for implementing special low level stuff like this.
> > For the majority of uses allowing null references is not necessary.
> 
> So you're suggesting dynamically allocating a dynamically sized array
> for each node in, say, a binary tree.  I really hope you never run into
> my data structures and algorithms lecturer... I can't imagine that idea
> would go over well. :P
> 
> Incidentally, "X* x = 0;" doesn't work in D.  Only "X* x = null;" will
> work, since 0 is an integer literal, not a pointer literal...

OK the point you make is that using nullable pointers is necessary.
I would agree, but say that all the examples you have given are at the library implementation level (code that most D developers probably wont want in what they do day to day).
IIRC D already has references like X x; but also pointers like in c which are X * x.

I would propose that library writers have to use the X * x pointer notation to do their null pointer low level library implementation stuff, and the rest of us use X x which becomes more difficult (not impossible) to make null.

> >> Saying they have no place in a language is just silly; the question
> >> should be whether they should be the default or not (I would contend
> >> that they shouldn't be.)
> 
> You didn't respond to this comment; the bit about using arrays in a tree
> above says to me that you want to push null as far out of the language
> as technically feasible, no matter the cost.
> 
> Nullable references are a tool.  I'm agreeing with you on the idea that
> it's the WRONG tool by default, but that doesn't mean we need to
> demonise it.  It is useful in cases where it's appropriate, and would be
> nigh impossible to replace.

Not as far as technically feasable, just that it should be opt in, and the simplest to type should be non nullable - the default as you suggest.
Sorry no demonisation intended.
Merely an intimation in the language that if you are dealing with nullable types you probably know what you are doing, as you are exposing yourself to error prone code.
 
> >>> In D :
> >>>
> >>> X x = new X;
> >>> This is a bit redundant, if we take away the ability to write X x; to mean X x = 0; then we can have X x; mean X x = new X;
> >>> If the class has a ctor then we can write X x(32); instead of X x = new X(32);
> >> Can I just say that I *LOATHE* this syntax?  It's one thing I always
> >> despised about C++; it simply makes NO sense whatsoever.  It looks like
> >> the bastard offspring of a function declaration and a function call.
> > 
> > Does that mean you loathe it in D now for structs too or just if it was implemented for classes ?
> 
> I loathe this:
> 
> > X x(32);
> 
> Maybe it's a matter of being used to it, but there is no way I can look
> at that and say "yup, looks like initialisation."  After all, it's only
> one token away from this:
> 
> > x(32);
> 
> And that's a function call.  Or one token away from this:
> 
> > X.x(32);
> 
> It just looks like too many other completely different things to be able
> to fit in the "initialisation"-shaped hole I have in my head.  For
> reference, when I see
> 
> > X x;
> 
> I mentally rewrite that to:
> 
> > X x = X.init;
> 
> No assignment, no initialisation.
> 
> >> The first *is* redundant, but then I wouldn't state X twice, I'd use
> >> "auto" (because types are almost never a single letter anyway.)  Add to
> >> that that the existing syntax is much more intuitive; it even reads like
> >> a sentence.
> > 
> > I think that is personal taste. The sentance starting with the word auto doesn't make much sense to me.
> 
> Not entirely; your example did contain redundancy, but only because you
> didn't use 'auto'.  I'm demonstrating that in D, saying 'X x = new X;'
> is redundant is an invalid argument because you CAN omit the type, at
> which point there is no redundancy.
> 
> But there is a level of personal preference at play here, I admit.  I
> don't like "X x(32);" and you don't like "auto"... I guess we're evenly
> matched.  :)

I was just pointing out that if we are looking at english sentances auto doesn't make much sense.
I do think that code with auto in it requires more searching to find the actual type of a variable. Not in auto x = new X; but in auto x = factory.create();

> You may not have noticed, but:
> 
> >> While **I'm a strong believer in non-nullable types**, I don't think
> >> null pointers are evil.  They're a tool like anything else; problems
> >> only arise when you misue them.
> 
> I'm *agreeing* with you that non-nullable should be default.  What I was
> arguing against was the apparent suggestion to outlaw the null pointer
> on pain of death.

You're right I thought you wanted the default to stay as it is.
Must be my comprehension of the double negative "non nullable types" :)

No pain or death suggested.
 
 
> How do you propose to write a template implementing nullable types when
> you aren't ALLOWED to use null?  You'd have to start casting around
> between integers and references, which is arguably worse than just
> supporting nullable types.
> 
In the code I wrote which might be considered for addition to a library.
I was using the T * val; notation which I would propose is still available to those that want nullable pointers.
Again it's use should be mostly limited to library implementation and wrapping C APIs etc.

> Incidentally, you cannot implement non-nullable types in D either, which
> suggests that we need language-level support for both.

Agreed the X * x = null; syntax is still good.

> Also, FYI, these two lines:
> 
> > struct Nullable<T>
> > void f(nullable!X x)
> 
> Should be:
> 
> > struct Nullable(T)
> > void f(nullable!(X) x)

Thanks !

> Note that I tested that second one with a D 1.x compiler; if it's valid
> in D 2.x, I'm not aware of it.  :)

So the only point of contetion between us is that you wont be happy with the syntax.
X x(32);
X x("bob");
Even though it is currently consistent with struct initialisation, and would save us all some typing.

Alex



More information about the Digitalmars-d mailing list