On Tuesday, 24 February 2015 at 20:46:28 UTC, H. S. Teoh wrote:
On Tue, Feb 24, 2015 at 08:21:53PM +0000, ketmar via Digitalmars-d wrote:
On Tue, 24 Feb 2015 20:11:17 +0000, weaselcat wrote:

> On Tuesday, 24 February 2015 at 20:04:27 UTC, Andrei > Alexandrescu wrote:
>> On 2/24/15 12:03 PM, weaselcat wrote:
>>> On Tuesday, 24 February 2015 at 19:40:35 UTC, Andrei >>> Alexandrescu
>>> wrote:
>>>> ...
>>>
>>> Off-topic, sorry Are we still going to get a Trusted >>> block, or >>> just going to use trusted lambdas?(They're kind of ugly >>> TBH)
>>
>> We're going to lambdas. Ugliness is a feature.
> Stroustrup would be proud ;)

yet he made the whole language ugly, instead of making only ugly
things ugly. ;-)

Actually, it's worse than that. He made things that shouldn't be ugly,
ugly, and things that *don't* look ugly are outright wrong.

For example, naked pointers have built-in, convenient syntax. They are
also extremely dangerous, and almost all C++ code containing raw
pointers have bugs one way or another.

For-loops have very nice syntax... except that unless you're writing the most inane, trivial loops, your code probably has bugs -- off-by-1
errors, wrong loop conditions, etc..

Calling malloc/free is also easy... and your program probably has memory leak bugs too. Not to mention type-safety bugs if you're not careful
about what you cast that void* into. But hey, writing:

        // Woohoo, bare pointer! Let's dance!
        void *p = malloc(1234);

sure looks prettier than:

        // Repeat after me: Don't repeat yourself... don't repeat
        // yourself... don't repeat yourself...
        MyType *p = (MyType *)malloc(sizeof(MyType));


Well, new/delete is prettier (as far as C++ goes anyway)... But wait,
you still have memory leaks.  Augh...

And what about cleaning up resources after you're done with them?

        void func() {
                Resource *res = acquireResource();
                doStuff(res);
                freeResource(res);
        }

Easy, right? Yeah, except that doStuff throws exceptions, so you have resource leakage. Solution? Write a long convoluted wrapper class with a dtor that cleans up. And a copy ctor that makes sure initializing one resource from another works correctly. And operator=() to make sure
assignments work correctly. Oh but wait, your ctor is not
exception-safe, so better rewrite *that* to use RAII too. Which means more copy ctors, more operator=()... oh wait, your copy ctor is not const-correct so it doesn't get called when you have a const object.
Yeah, and your operator=() too. And ...

After it's all said and done, what used to be a 3-line function has exploded into a monstrosity who knows how many lines long, with arcane incantations of auto_ptr<>, shared_ptr<>, and all that fancy stuff that
no newbie ever has the hope of parsing, let alone understanding.

        http://bartoszmilewski.com/2013/09/19/edward-chands/

Favorite quote:

        C++ has become an extremely complex language. There are
        countless ways of doing the same thing — almost all of them
        either plain wrong, dangerous, unmaintainable, or all of the
above. The problem is that most code compiles and even runs. The mistakes and shortcomings are discovered much later, often after
        the product has been released.

Yep, that's exactly why D has ruined my life, I just can't go back to
that C++ garbage anymore.


T

Almost all those warts are caused by the C compatibility and affect also D to certain extent.

Any language that tries to achieve copy-paste compatibility with C will suffer from it.

--
Paulo

Reply via email to