null Vs [] return arrays
Regan Heath
regan at netmail.co.nz
Tue Apr 5 10:24:49 PDT 2011
On Fri, 01 Apr 2011 18:23:28 +0100, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> On Fri, 01 Apr 2011 11:52:47 -0400, Regan Heath <regan at netmail.co.nz>
> wrote:
>> But, in D it seems I cannot do this. In D I would have to pass an
>> additional boolean parameter, or add another level of indirection i.e.
>> pass a string[]*. The same problem exists in C if I want to pass an
>> 'int' or any primitive type, I have to pass it as int*, use a boolean,
>> or invent a 'special' value which means essentially
>> NULL/not-set/ignored.
>
> assert("" !is null); // works on D. Try it.
Yes, but that's because this is a string literal. It's not useful where
you're getting your input from somewhere else.. like in the other 2 use
cases I mentioned.
However.. I've realised that in those cases, where you have an input array
you can slice, eg.
auto y = "a=123&b=&c=456"
auto z = y[8..8];
I do get an array 'z', with a non-null ptr. So, provided D doesn't lose
this information when I pass it around I am fine. The other use case may
be a little more problematic depending on the method used to read the
input from the keyboard, IIRC one of the methods returns null for a blank
line of input, which I would have to detect and 'fix' using emptyArray if
I wanted to pass it to something that cares about the distinction.
>> I'm not too bothered what syntax gets used, provided it was something
>> that you don't accidently use when you do not want it, and wasn't too
>> horrible to use as I don't see this as being a very uncommon occurance
>> (which would warrant/allow ugliness of syntax). "[]" >> seems logical,
>> as does "new T[]", both are not "null" so the programmer was obviously
>> trying to do something other than pass null.
>It's one thing to want an array with a non-null pointer, but it's
> another thing entirely to want an array with a non-null pointer which
> points to a valid heap address.
I don't specifically want either of those things. I just want _some way_
to represent 'exists but is empty' and for it to be different to 'does not
exist'. Currently D's arrays cannot do that, yet a plain old pointer can.
> In my opinion, [] means empty array. I don't care what the pointer is,
> as long as the array is empty. The implementation can put whatever
> value it wants for the pointer. If it wants to put null, that is fine.
> null means I want a null pointer.
> If I had it my way, all array literals would be immutable, and the
> pointers would point to ROM (even empty ones). We should not be
> constructing array literals at runtime. But my opinion is still that
> you should not count on the pointer being anything because
> it's not specified what it is.
Sure, I agree with all that, but I still want some way of representing
both states and detecting both states and the problem is that if the
language cannot do it at a fundamental level, and requires some weird hack
or reliance on string literals then when I use any 3rd party library, or
phobos itself it will tell me null and I will have to guess which state it
actually means and 'fix' it manually.
>> That seems to work, but it's hideous syntax for something that is not
>> that uncommon IMO.
> My opinion is that it is uncommon, but it can be abstracted:
> template emptyArray(T)
> {
> enum emptyArray = (cast(T*)0)[1..1];
> }
> rename as desired.
Not useful if you're getting your input from somewhere else, vs trying to
create a new empty array.
That said, if I were to want this I'd use the literal instead as it seems
safer, eg.
template emptyArray(T)
{
enum emptyArray = cast(T[])""[0..0];
}
> This code seems to disagree with your results for case 5 (dmd 2.052):
>
> auto x = cast(char[])""[0..0];
> assert(x.ptr != null); // no failure
Nope, my case 5 had a 'dup' which you're missing. If I add a new case
returning a literal as you have there I get the same result as you. I was
intentionally avoiding the literal because I knew it would be non-null (I
believe D null terminates literals) and because I want to be able to
detect these states on more than just empty string literals.
R
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d-learn
mailing list