C++ named operators(github.com)
github.com
C++ named operators
https://github.com/klmr/named-operator
7 comments
I did much the same thing in Python a while ago: https://github.com/borntyping/python-infix
Very cool and elegant; thanks.
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.
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.
Yes. This is fun, but FAR too clever. I can only speculate at the baffling compile errors... it doesn't bear thinking about. shudder
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:
Even then, though, that would get ugly in a hurry when mixed with function calls, requiring parentheses for sanity.
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.
Some prior art: http://www.gamedev.net/blog/2/entry-19599-bad-code-here/
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/
* is a better choice if you need something arithmetic-like, for instance
vector3 a, b;
float f = a *dot* b;
vector3 c = a *cross* c;MMh. You could also this syntax for generating HTML couldn't you ?
I present to you: XSMELL: http://www.gamedev.net/topic/539056-c-bask-in-my-awesomeness...
Imagine if somebody did this for regex!
Do you mean Boost Spirit?
http://en.wikipedia.org/wiki/Spirit_Parser_Framework
http://en.wikipedia.org/wiki/Spirit_Parser_Framework
I don't think I'm going to be able to sleep tonight.
Interesting ! thanks for the pointer !
Just promise you won't use it in production on the same continent as me ;)
LOL. Don't worry - I don't code in C++ atm.... but when I do have the opportunity to code C++ and need XML i will give it a try.
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.
[1]: http://www.yesodweb.com/book/shakespearean-templates
[1]: http://www.yesodweb.com/book/shakespearean-templates
The following code is legal C++ and does exactly what you’d expect it to do.
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?
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?
This is fully explained in the primary link if you read past the tl;dr section.
I think the point is that this isn't... necessarily idiomatic C++.
>I had no idea what that might do. No expectations at all.
Really? How is it any different than: "Hello".repeat(3).join(",");
Really? How is it any different than: "Hello".repeat(3).join(",");
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.
Depends on the language I guess.
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:
Using an Extension Method, it's easy to see how someone could mistake the output:
https://ideone.com/DuIvZN
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:
String.Join(", ", Enumerable.Repeat("Hello", 3))
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
Does this increase the stack by 2 in every call?
It's a header-only library, so it should be inlined.