Beyond D2
Contents
Motivation
This page can be used as a centralized place to discuss parts of D2's design that are controversial, undesirable or that could be improved, including those that are too late to fix in D2. Also discussed here are features that would be worthy of consideration in a hypothetical successor for D2 (D3? E? ). This page came up from email thread [1];
Questionable design choices
- is virtual by default a good idea with separate compilation model?
Syntax changes
- get rid of C-style expression lists in parenthesis; these would be reserved for tuples
- Go style a := b meaning auto a = b
- semi-column optional
- Go style lightweight if/while/etc expressions that don't require () around the if statement:
while x>=0 {...}
- full UFCS support: foo.mixin, foo.assert, foo.stringof, foo.typeof
Features to improve
- improved dmd/rdmd command line: [DIP41: dmd/rdmd command line overhaul]
Features to drop
- can we get rid of @property?
- strings: stop conflating range of code points with range of code units:
- "foo" represents a range of code points
- "foo".rep represents a range of code units, eg: immutable(char)[]
- This would remove a *lot* of special case code in phobos and make it easier to write generic code
- eg, would remove need for distinguishing ElementType vs ForeachType
- I've discussed this in email:"iteration over a string"
- There was an email form Andrei mentioning that as well (something along: if we were to do it again we would've required "foo".rep to get a string's representation)
- drop built-ins: foreach_reverse, sort
Features to add
- AST macros
- would enable many features; eg:
- supersedes: "proposal: a new string litteral to embed variables in a string"
- supersedes: "feature request: __ARGS__ for logging (cf __FILE__, __LINE__, __FUNC___)"
- would enable many features; eg:
- Compiler as a library (eg llvm/clang toolchain)
- Compiler written in D2, and then bootstrapped from their as done in rust and many other languages
- python style named parameter arguments
- Yield return
- R-value references
- language syntax for tuples; unify syntax for compile time tuples with runtime tuples
- could follow DIP32 but use (a,b) syntax instead; we would get rid of C-style expression lists to enable this
- allow JIT (to be used sparingly), to allow runtime eval statements.
More controversial features to add
- store code as AST,
- The 1st idea is to get rid of styleguides completely and allow people to read/write code with their preferred style. Codes gets stored and exchanged as AST; clients read the AST and converts it on the fly as source code in the user's preferred formatting.
- speeds up compilation: only currently modified code needs to get translation from source to AST
- More future proof and eases refactoring
- Allow transparently including C headers in code as in Go; could use swig behind the scenes
[1] Related email thread: 'Maintain notes for D's successor? [Was: Re: Why the @ in @safe? & UDAs]'