What are (were) the most difficult parts of D?
H. S. Teoh
hsteoh at quickfur.ath.cx
Mon May 16 15:08:15 UTC 2022
On Mon, May 16, 2022 at 04:00:12AM +0000, cc via Digitalmars-d-learn wrote:
> On Wednesday, 11 May 2022 at 05:41:35 UTC, Ali Çehreli wrote:
> > What are you stuck at? What was the most difficult features to
> > understand? etc.
> >
> > To make it more meaningful, what is your experience with other
> > languages?
[...]
> Immutability. Ended up having to do so many hundreds of casts to and
> from immutable(whatever) the amount of mental strain greatly exceeded
> whatever benefits the entire concept is supposed to offer.
If you find yourself having to cast to/from immutable, you're using it
wrong. Most of my code doesn't have a single mention of immutable in
it, and I don't care. It's there for when it's relevant, if it's not
useful, don't use it.
> Safety? Performance, in a future compiler version? I don't know
> where it's at right now.
What about performance?
For anything performance-related, I don't even look at dmd, I use LDC
all the way. DMD is only useful for fast compile-run-debug cycle, I
don't even look at performance numbers for DMD-produced executables, it
doesn't mean anything to me.
> But you'd think I could do something like load some data from disk,
> craft a few objects, mark them as immutable, and shove them in an
> array or associative array without it being a nightmare, but it isn't.
An explicit example would be nice.
I write D programs that process input files all the time, including
stuffing data into AAs and what-not, and it Just Works(tm). But not
once did I bother with immutable (why should I?). The most I'd do is to
mark something const (you might want to read up on the difference
between immutable and const -- maybe that's why you had so much
trouble), but even that I don't bother with most of the time. Const in D
has limited utility beyond leaf-node data structures and modules, just
let it be mutable and call it a day.
> Or, having an otherwise mutable class with a member that references an
> immutable class, but can change which immutable instance it's
> referencing, without having to cast away the immutability of the thing
> I'm trying to protect in the first place. So I just stopped doing it,
> and simply rely on the "just don't make mistakes" practice to avoid
> writing to things that shouldn't be written to now.
Just make things private and use getters/setters to control access. Like
I said, if you find yourself writing lots of casts when using
immutable/const, you're probably doing it wrong.
[...]
> On another topic, the lack of a good "delete" keyword doing what one
> would expect, when there's a perfectly good "new" without its matching
> existential companion. This, and the ways around it, have already
> been discussed to death though, but banging my head over trying to
> force deterministic memory management into the GC-controlled D
> universe did take its toll on a good year or two of productivity.
Why would you want to force deterministic memory management onto
GC-allocated objects? Just use malloc/free (or whatever else you
fancy). Slap @nogc on main() and go from there, if that helps.
IME, most programs don't actually need to care whether their memory is
manually-managed or GC'd. Many of my programs use GC freely, except in
inner loops where tigher control is needed, then I either preallocate or
use malloc/free. But only where it actually makes a difference to
performance. Outside of performance bottlenecks I don't bother with
memory management, just let the GC do its job.
T
--
Latin's a dead language, as dead as can be; it killed off all the Romans, and now it's killing me! -- Schoolboy
More information about the Digitalmars-d-learn
mailing list