digitalmars.D.bugs - [Issue 1255] New: operator overloading
- d-bugmail puremagic.com (40/40) Jun 03 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1255
- Jarrett Billingsley (11/14) Jun 03 2007 Kind of OT, but I think one of the questions is: is it really necessary ...
- d-bugmail puremagic.com (29/29) Jun 03 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1255
- d-bugmail puremagic.com (10/10) Jun 04 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1255
- d-bugmail puremagic.com (10/10) Jan 08 2011 http://d.puremagic.com/issues/show_bug.cgi?id=1255
http://d.puremagic.com/issues/show_bug.cgi?id=1255
Summary: operator overloading
Product: D
Version: 1.014
Platform: PC
OS/Version: Windows
Status: NEW
Severity: enhancement
Priority: P2
Component: DMD
AssignedTo: bugzilla digitalmars.com
ReportedBy: Daniel919 web.de
Hi, I try to figure out, whether a port of boost::spirit to D would be
possible.
This library is heavily using C++ operator overloading.
Now there are some problems I figured out:
C++ allows the * operator to be overloaded in case of dereferencing.
Spirit uses it as the "kleene star": *(expr) means repeat expr 0 or more times.
D has opMul(_r), which overloads: "a*b" and "null*b", but not: "*b" since the
latter means dereferencing.
In the docs it's said "!", "&&" and "||" will likely never be overloadable.
C++ allows all of them to be overloaded and spirit makes use of it.
"!(expr)" means expr is optional (so 0 or 1 match). "||" and "&&" are used for
sequential matching.
So my feature req for D:
without further arguments:
*(expr) -> opDeref()
!(expr) -> opNot()
&(expr) -> opAddr()
WITH one more argument and _r:
expr1 && expr2 -> opAndAnd
expr1 || expr2 -> opOrOr
expr1 , expr2 -> opComma
The following is not possible in C++:
value = expr1 expr2;
Because nothing is not overloadable as an operator.
What about opNothing in D ;) ?
Thanks in advance,
Daniel
--
Jun 03 2007
<d-bugmail puremagic.com> wrote in message news:bug-1255-3 http.d.puremagic.com/issues/...http://d.puremagic.com/issues/show_bug.cgi?id=1255 Hi, I try to figure out, whether a port of boost::spirit to D would be possible.Kind of OT, but I think one of the questions is: is it really necessary to have something like Spirit in D? We have much more powerful compile-time constructs at our disposal, like CTFE, compile-time string manipulation, and string mixins, which basically allow us to generate any kind of code we'd like from some other, more reasonable looking DSL. An example can be found here: http://www.dsource.org/projects/scrapple under DParser. A link to the relevant topic is: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.annou ce&article_id=6664. So you can write grammars that look like grammars, which is pretty nice.
Jun 03 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1255
As Jarrett pointed out in the NG follow-up, porting Spirit line-by-line is
undoutedly the wrong way to go about it.
With spirit you can have the syntax:
boost::spirit::rule<ScannerT> factor, term;
term = factor >> *( ( '*' >> factor) | ( '/' >> factor ) );
Which admittedly looks pretty similar to BNF.
But with the compile time text processing stuff that's been going into D you
can just use the BNF:
mixin(Rule!(
"term ::= factor ( ( '*' factor ) | ( '/' factor ) )*"
));
And maybe eventually the 'mixin' part won't be necessary either, but for now it
is.
Operator overloading abuse is cute, but it's just working around the lack of
ability in C++ to do more generic compile-time processing. The biggest issue
with operator overloading for this kind of thing is that you're stuck with the
built-in precedence rules and operators (*prefix* kleen star?)
One approach might be to build a standard API-based syntax for a
http://www.codeproject.com/csharp/spart.asp). Then use the compile time string
facilities in D to translate BNF strings to that API.
Just a thought.
But in any event, I can tell you for sure that "I want to use unary * as a
Kleen star operator so D needs to have opDeref()" is not an argument that will
gain any traction with Walter. He's a firm believer in operator overloads not
changing the semantics of the underlying operator.
--
Jun 03 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1255 It would be really nice without the need of writing "mixin" and with more compile-time function capabilities. Having an API and then translate the EBNF string onto it sounds like a good idea. This way the EBNF can be kept 100%, so there would be no reason for having ">>" like it's necessary in spirit. Thanks for clarifying this. --
Jun 04 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1255
Andrei Alexandrescu <andrei metalanguage.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
CC| |andrei metalanguage.com
Resolution| |WONTFIX
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 08 2011









"Jarrett Billingsley" <kb3ctd2 yahoo.com> 