On Saturday, 28 April 2012 at 18:48:18 UTC, Walter Bright wrote:
Andrei and I had a fun discussion last night about this question. The idea was which features in D are redundant and/or do not add significant value?

A couple already agreed upon ones are typedef and the cfloat, cdouble and creal types.

What's your list?

First, I completely agree with some points already made here, and I completely disagree with a few others.

A modern compiler should be as powerful and convenient as possible, I completely disagree that a compiler can't do a broad range of things very efficiently _and_ with a smooth learning. Indeed this is what attracted me to D in the first place, the idea that it has the low level power of C++ when you get down to it, but it's also attractive and initially easy to use.



What I think should be removed/changed:

- Drop is( ... ) and extend "__traits()" (however "__traits" should become .metaof or something along those lines). Also, a easy to understand traits lib should be imported by default like Object.d

- Enum as manifest constant - I agree, this is better as "static x = 10" or equivalent. I was actually confused at first when I realized enum's where what was *supposed* to be used for that.

- foreach_reverse. Dmitry's gave a good alternative. Though, I think a more intelligent 'foreach' (or even 'for') statement could address this as well. Something like:

    for (key, value of range, step) {
        ...
    }

    // Where step values which can be deduced at compile time
    // are used to produce the most optimizated code.

- version statements - this would be a lot more consistent as a static if() I think. But it does need a more obvious syntax, possibly something like:

    static if ("foo" in Compiler.flags) {
        ...
    }

- .di files - I agree with foobar here. Other language have had this for awhile, and it makes linking a much easier concept.

- NaN as default - I've said this before on here, but I think it deserves being said again. FP values defaulting to Nan is a debugging feature, and should be explicitly expressed in areas which need to guarantee a variable is set after declaration. A useful, and consistent default should be used instead. Ints (the other number type) default to zero, and because zero is the most practical and commonly understood, FP values should start here as well.

- commas - should be use for tuples and parameters, not as ending marks:

    int, int foo() { return 5, 6; }

    auto x, y = 2;    // x = 0, y = 2
    auto x, y = 2, 3; // x = 2, y = 3

    x, y = foo();     // x = 5, y = 6



What should stay:

- foreach (or an intelligent 'for' as exampled above). This is an incredibly convenient, tried 'n true feature.

- built-in Associative Arrays - one of D's sexiest features. It's very useful for many things, and always having it at your disposal is a logical choice.

- properties - another incredibly convenient feature. I think a more sexy implementation of properties are in order, but the construct is great. It would be nice to have properties as a language type, rather than a attribute:

    struct Foo {
        property int x { get; private set; }
        property int y {
            get()    { return x; }
            set(T t) { x = t; }
        }
    }

    // Or the syntax could follow Types:

    property x : int { ... }

    // Which could be templated:

    property y(T = int) : int {
        static if (T.isType!int) {
           ...
        }
        else {
           ...
        }
    }

- with statement - no reason to kill it really and it's useful in some places. Helps keep code short and readable.

- Anonymous class - There's no reason to remove this feature, it's not hurting anyone and it could allow for interesting frameworks similar to jQuery.



Other things that would be cool:

- static foreach

Reply via email to