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

Reply via email to