On Mon, 25 Mar 2013 22:21:47 -0400, Vladimir Panteleev <vladi...@thecybershadow.net> wrote:

On Tuesday, 26 March 2013 at 01:57:10 UTC, Steven Schveighoffer wrote:
On Mon, 25 Mar 2013 17:28:51 -0400, Vladimir Panteleev <vladi...@thecybershadow.net> wrote:

On Monday, 25 March 2013 at 14:46:27 UTC, Steven Schveighoffer wrote:
I would favor just changing the behavior.

That would silently break my code.

It would seem incomplete not to have if(arr) work, and the way it works now is very error prone.

You would have to change your code either way. Deprecating than reintroducing seems gratuitous to me. Most people do not use if(arr) to check for array pointer when if(arr.ptr) is more descriptive.

How much do you use this "feature"? Can they simply be replaced with if(arr.ptr)? or are they more of the type Jacob has with if(auto a = getArray())? I'm trying to get a feel for how much breakage this causes, as I typically do not use that construct.

No, it's nothing like that. In fact, it's very simple:

Users will download my open-source program, compile it successfully, then try using it - at which point, it will crash, produce incorrect output, or do something equally bad. Would you not agree that this is unacceptable?

Well, it's unacceptable as long as the code is not updated, or you caveat it by saying it only was tested on compiler version X or earlier. If we go through a deprecation cycle, and then reintroduce if(arr) to mean if(arr.length), then we are in the same situation as long as you haven't updated your code.

Furthermore, I would have no way to automatically find all places where I would need to change my code. I would need to look at every if statement of my program and see if its behavior depends on whether the string/array is empty or null. My program is quite large, so, again, this is unacceptable.

That I agree is unacceptable. We would have to take the unusual step of having a tool/compiler flag to identify the places this happens. Asking people to review their code by hand is not what I had in mind.

I use this feature in the same way that anyone uses a nullable type. It's the same distinction between a pointer to struct that is null, or that is pointing to an instance containing the struct's .init. It's the same distinction between a value type T and the benefits of Nullable!T. "null" is usually used to indicate the absence of a value, as opposed to an empty value.

The breaking distinction is between null and a non-null empty string. In the cases where the code is setting a non-empty array, this is not an issue. This is why I asked about usage. It may turn out that you are checking for null, but really because when the value is set, it's never empty, it's not an issue.

Although I can see how this can trip up new users of D, personally I prefer things to be just the way they are now. That said, I wouldn't be against forcing one to write "s is null", if the consensus was that this would improve D.

I understand the idea to use null as a "special" array value. But the truth is, nulls act just like empty arrays in almost all aspects.

The critical failure I see is this:

int *p = null;
if(p == null) is equivalent to if(!p) and if(p != null) is equivalent to if(p).

But for arrays:

int[] a = null;
if(a == null) is NOT equivalent to if(!a), and if(a != null) is NOT equivalent to if(a). This is the part that screws up so many people. Because == does not do the same thing, we have a quirk that is silent and deadly. It's made even worse that for MOST cases, if(!a) is equivalent to if(a == null). So it's very easy to miss this critical distinction, and it's not at all intuitive.

-Steve

Reply via email to