On 2016-09-28 03:18, Minty Fresh wrote:
Currently, D offers fine grained overloading for most of the unary and arithmetic binary operators, but at some point a decision was made to lump together all of the relational operators (and if necessary, the equality operators) into a single function `opCmp`. And while it does add a lot of convenience and consistency to how operators behave, it does also put a lot of limitations on what they can do.For example, it's not currently possible to implement comparison operators that would behave lazily and only compute a certain value once a function call forces the computation. Similarly, it's not possible to construct a DSL that would produce code or a query in another language, by returning values behave like AST nodes rather than actually performing a comparison. ie. table.users .where!((users) => users.joined_on >= 3.days.ago) .joins(table.posts) .on!((posts, users) => posts.user_id == users.id) .limit(10) .toSql; It's a little odd to me that D puts so little focus on DSLs, since language features like template constraints, `opDispatch`, and even the fact that binary operators are overloadable via a single templated function are all very useful tools for implementing them.
I completely agree. Or we could go with an even more general approach: AST macros [1].
[1] http://wiki.dlang.org/DIP50 -- /Jacob Carlborg
