On 11/19/2014 10:09 AM, Ary Borenszweig wrote:
I agree. An array's length makes sense as an unsigned ("an array can't have a
negative length, right?") but it leads to the bugs you say. For example:

~~~
import std.stdio;

void main() {
   auto a = [1, 2, 3];
   auto b = [1, 2, 3, 4];
   if (a.length - b.length > 0) {
     writeln("Can you spot the bug that easily?");

Yes.

   }
}
~~~

Yes, it makes sense, but at the same time it leads to super unintuitive math
operations being involved.

Computer math is not math math. It is its own beast, and if you're going to write in a systems programming language it is very important to learn how it works, or you'll be nothing but frustrated.


Rust made the same mistake and now a couple of times I've seen bugs like these
being reported. Never seen them in Java or .Net though. I wonder why...

D is meant to be easily used by C and C++ programmers. It follows the same model of signed/unsigned arithmetic and integral promotions. This is very, very deliberate. To change this would be a disaster.

For example, in America we drive on the right. In Australia, they drive on the left. When I visit Australia, I know this, but when stepping out into the road I instinctively check my left for cars, step into the road, and my foot gets run over by a car coming from the right. I've had to be very careful as a pedestrian there, as my intuition would get me killed.

Don't mess with systems programmers' intuitions. It'll cause more problems than it solves.

Reply via email to