On Monday, 4 March 2024 at 13:37:53 UTC, Fidele wrote:
Is D programming friendly for beginners?

Only if you use `@safe` on your `main` function and essentially everywhere except templates (those infer `@safe` and you should let them do that). `@system` is an expert tool, unfortunately, it’s the default. Unless you use `@safe`, it is actually easy to accidentally corrupt memory. For short, `@safe` disallows any operation that could introduce undefined behavior, in particular memory corruption.

There are so-called preview switches on the compiler. Those enable latest features or bugfixes that are incompatible with the old langue state. If a preview feature is deemed ready for production, it’ll become active by default. IMO, the following preview switches should be enabled: * `-preview=dip1000` This allows more operations in `@safe` code, but error messages can become more cryptic. E.g., pre-DIP1000, taking the address of a local variable was illegal and with DIP1000, it’s allowed under certain circumstances, but when it’s not okay, the error message isn’t simply “you can’t do that”. It will become the default at some point, so it might be worth to learn its semantics from the beginning. * `-preview=dip1008` Allows allocating `Error` objects in `@nogc` code. Makes `@nogc` code more useful. * `-preview=fieldwise` Must have. Fixes auto-generated comparisons for structs.
* `-preview=fixAliasThis` Fixes lookup of `alias this` constructs.
* `-preview=nosharedaccess` Must have. Fixes `shared`, which can be unsafe otherwise. * `-preview=in` Makes the parameter storage class `in` actually useful. Note: This is dangerous without `@safe`. Under the preview switch, `in` makes strong guarantees, but without `@safe`, it is assumed, but not checked, if the guarantees truly hold. With `@safe`, however, they are checked and it’s fool-proof. * `-preview=inclusiveincontracts` Must have. Fixes function contracts. * `-preview=fixImmutableConv` Must have. Fixes various conversion issues in the type system.

Not actively recommended, but not actively harmful either:
* `-preview=bitfields` Unclear if it’s going to stay.
* `-preview=systemVariables` Primarily relevant if you write `@system` code. First learn the language. (No harm if enabled.)

Recommended to stay away from:
* `-preview=rvaluerefparam` Don’t use it. It’s never going to be the default and likely will be removed in the future in favor of something else.

The reason I’m advocating preview switches is because as a learner, you’re likely not writing production code that’s going to stay, but throwaway code for the purpose of you gaining knowledge of the language.

Reply via email to