I don't think it would be as easy as what hamlet [1] looks like, since C++ doesn't have a notion of quasi quoting as far as I am aware, but it might be interesting.
Gah. Nice idea, but the double-operator hack seems quite painful and error prone, especially with operators right in the middle of the precedence hierarchy.
This might be one of the few rare justifications for overloading the comma operator, for syntax similar to that of Haskell's backquote:
arbitrary+expr ,foo, arbitrary-expr
Then the ,foo, would get processed last, letting the expressions evaluate first, which matches the semantics of Haskell's infixing backquotes (lowest precedence by default).
Even then, though, that would get ugly in a hurry when mixed with function calls, requiring parentheses for sanity.
operator, is one of the operators defining a sequence point (e.g. guaranteeing the left side of the expression executes in whole before the right - others being &&, ||, and ?:.)
Overloading the operator removes this sequence point. Too sketchy for my blood.
Mostly because the order of operations is unclear. I read it as producing "HelloHelloHello, ". That is, repeat the previous thing three times and then concatenate that with the string ", ". It's surprising to me that "repeat" results in a new object with new semantics.
This is too clever to the point of being painful. (Not to mention, it has a performance penalty for no real benefit.)
I think I'd just give up and go home if I ever saw this in code I had to maintain.
EDIT: Actually, looking more closely, I guess there isn't a performance penalty (I saw back_inserter and assumed it was required for the implementation). That said, I still think it's far too clever.
29 comments
[ 2.7 ms ] story [ 64.6 ms ] thread[1]: http://www.yesodweb.com/book/shakespearean-templates
http://en.wikipedia.org/wiki/Spirit_Parser_Framework
This might be one of the few rare justifications for overloading the comma operator, for syntax similar to that of Haskell's backquote:
Then the ,foo, would get processed last, letting the expressions evaluate first, which matches the semantics of Haskell's infixing backquotes (lowest precedence by default).Even then, though, that would get ugly in a hurry when mixed with function calls, requiring parentheses for sanity.
Overloading the operator removes this sequence point. Too sketchy for my blood.
Some prior art: http://www.gamedev.net/blog/2/entry-19599-bad-code-here/
auto result = "Hello" <repeat> 3 <join> ", ";
I had no idea what that might do. No expectations at all. Is this an attempt to write language X in language Y?
Really? How is it any different than: "Hello".repeat(3).join(",");
I read it as "repeat the string Hello thrice and then add a comma and space". It's not really clear that "repeat" returns a list.
A C# equivalent would be:
Here it's easier to see that Repeat returns an Enumerable object.Using an Extension Method, it's easy to see how someone could mistake the output:
https://ideone.com/DuIvZN
I think I'd just give up and go home if I ever saw this in code I had to maintain.
EDIT: Actually, looking more closely, I guess there isn't a performance penalty (I saw back_inserter and assumed it was required for the implementation). That said, I still think it's far too clever.