On Saturday, 17 September 2022 at 19:58:24 UTC, 0xEAB wrote:
>On Thursday, 15 September 2022 at 08:40:22 UTC, Dukc wrote:
>What features could be removed from D if it were up to you?
The (already deprecated) «body» keyword.
BUT: only because it’s already been superseded by «do»
Please consider the breakage that would result from the removal
Legacy code (that doesn’t compile without warnings anymore).
Also it’s one step towards more ambiguity (because «do» got several meanings now).
It’s no problem whatsoever when a keyword has multiple meanings if those meanings are reasonably distinct. Best example is in
: It serves as a storage class (in
parameter), it serves as a precondition contract, and it serves as an operator (in tango with !in
).
Sometimes, people complain that static
is too overloaded. It means “needs no context” or “runs at compile-time” or “(variable value) survives through calls”.
I’ve gone through all the keywords. Apart from special tokens and fundamental types (except void
), there are 36 with a unique semantics and 40 with multiple semantics. Note that those with “unique” are those for which I don’t know of multiple. It could be that I missed some.
The full list:
Keyword | Uses | Notes |
---|---|---|
abstract |
2 | abstract method, abstract class |
alias |
2 | alias, alias – this |
align |
1 | |
asm |
1 | |
assert |
2 | assert, static assert |
auto |
2 | storage class, auto ref |
body |
0 | |
bool |
type | |
break |
1 | |
byte |
type | |
case |
2 | switch – case, goto case |
cast |
1 | |
catch |
1 | |
cdouble |
type | |
cent |
type | |
cfloat |
type | |
char |
type | |
class |
2 | class declaration, anonymous class object |
const |
2 | type ctor, storage class |
continue |
1 | |
creal |
type | |
dchar |
type | |
debug |
2 | debug (v), debug = v |
default |
2 | switch – default, goto default; |
delegate |
2 | lambda introducer, function ptr type |
delete |
0 | |
deprecated |
1 | |
do |
2 | do – while, function body introducer |
double |
type | |
else |
≥ 4 | if – else, static if – else, version – else, debug – else |
enum |
2 | enumeration types, enum values |
export |
1 | |
extern |
1 | |
false |
1 | |
final |
2 | final class, final method |
finally |
1 | |
float |
type | |
for |
1 | |
foreach |
2 | statement, static foreach |
foreach_reverse |
2 | statement, static foreach_reverse |
function |
2 | lambda introducer, function ptr type |
goto |
2 | goto label, goto case/default |
idouble |
type | |
if |
3 | statement, static if, template constraint |
ifloat |
type | |
immutable |
2 | type ctor, storage class |
import |
1 | |
in |
3 | storage class, contract, operator |
inout |
2 | type ctor, storage class |
int |
type | |
interface |
2 | interface type declaration, is(T ==interface) |
invariant |
1 | |
ireal |
type | |
is |
2 | is operator, is expression |
lazy |
1 | |
long |
type | |
macro |
0 | |
mixin |
2 | string mixin, mixin template |
module |
1 | |
new |
1 | |
nothrow |
1 | |
null |
1 | |
out |
2 | storage class, contract |
override |
1 | |
package |
2 | package declaration, visibility attribute |
pragma |
1 | |
private |
1 | |
protected |
1 | |
public |
1 | |
pure |
1 | |
real |
type | |
ref |
2 | storage class, auto ref |
return |
2 | statement, storage class |
scope |
2 | storage class, scope guards |
shared |
2 | type ctor, storage class |
short |
type | |
static |
≥ 5 | static variable, static if, static foreach, inner type/function w/o context, static assert |
struct |
3 | struct type declaration, is(T == struct), unnamed struct components |
super |
2 | super subobject, ctor call |
switch |
1 | |
synchronized |
1 | |
template |
2 | template, mixin template |
this |
3 | this object, typeof(this), forwarding ctor |
throw |
2 | throw expression, attribute |
true |
1 | |
try |
1 | |
typeid |
1 | |
typeof |
1 | |
ubyte |
type | |
ucent |
type | |
uint |
type | |
ulong |
type | |
union |
3 | union type declaration, is(T == union), unnamed union components |
unittest |
2 | unit tests, version (unittest) |
ushort |
type | |
version |
2 | version (v), version = v |
void |
2 | type, void init |
wchar |
type | |
while |
1 | while loop, do – while loop |
with |
1 | |
__FILE__ |
special token | |
__FILE_FULL_PATH__ |
special token | |
__MODULE__ |
special token | |
__LINE__ |
special token | |
__FUNCTION__ |
special token | |
__PRETTY_FUNCTION__ |
special token | |
__gshared |
1 | |
__traits |
1 | |
__vector |
1 | |
__parameters |
1 |
(Anyone here is free to improve on this list. Use it for whatever you want.)