Proposal : allocations made easier with non nullable types.
Nick Sabalausky
a at a.a
Mon Feb 9 23:18:39 PST 2009
"Daniel Keep" <daniel.keep.lists at gmail.com> wrote in message
news:gmpd71$8uj$1 at digitalmars.com...
> 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?
>
Null Object Pattern:
--------------
class LinkedListNode(T)
{
LinkedListNode!(T) next;
private static LinkedListNode!(T) _end;
static LinkedListNode!(T) end() {
return _end;
}
static this() {
_end = new LinkedListNode!(T);
}
}
--------------
However, I admit this is little more than re-inventing null. But it's at
least possible.
> 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.)
>
Agreed.
>> 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.
>
> 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.
>
Just a thought: Would you hate this less:
X(32) x;
>> Only when the types of the pointer and class are different do we need to
>> write X x = new Y;
>> We can do this syntactically in D because classes cannot be instantiated
>> on the stack (unless scope is used, which I have found a bit pointless,
>> as members are not scope so no deterministic dtor)
>
> I made a proposal quite some time ago detailing how we could have not
> only scope members of classes, but even scope RETURN values, but I think
> it got maybe one reply... :P
>
> Given that one of D's tenets is to make it simpler to write
> deterministic, bullet-proof code, the complete lack of deterministic
> destruction of classes has always felt like a huge hole in the language.
>
I don't suppose you have a link or the subject line of that handy?
>> As I said in the nullable types thread:
>> Passing 0 or 0x012345A or anything else that is not a pointer to an
>> instance of X to a variable declared as X x is the same as mixing in a
>> bicycle when a recipe asks for a cup of olive oil.
>
> Passing garbage to a function doesn't have any bearing on the
> non-nullable discussion. If you're casting random integers to pointers
> and passing them to functions, you reap what you sow. :)
>
> That said, passing null is more like omitting an ingredient. Which is
> unfortunate if you're making soup and the ingredient is "water."
>
I have to say, I'm loving these analogies :-)
> 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 believe they're the wrong default choice, because they don't come up
> in normal code, but you've got to fall over yourself to make sure they
> don't become an issue.
>
That's pretty much my opinion on the matter as well. Null Object Pattern is
a usable alternative to nullables, and even more powerful (the "null" is
capable of functions, data and polymorphism), but in the cases when you
don't need that extra power, a non-default nullable is just less work and
isn't really any less safe.
> Eventually, I tracked it down to one of the few places in the code that
> I forgot to assert the reference was non-null. It was null because
> Microsoft didn't bother to document that a particular "magic object"
> doesn't exist until a certain point.
>
C#/.NET does seem to have some odd quirks like that. A few weeks ago, I was
pulling my hair out figuring out a particular bug, and stepping through in
the debugger only perplexed me more. Turned out there was an object with a
property I was setting, but the new value was somehow "queued" and didn't
actually take until later on. The docs hadn't mentioned that particular
behavior.
More information about the Digitalmars-d
mailing list