Bill Baxter wrote:
On Wed, Feb 18, 2009 at 3:36 AM, Andrei Alexandrescu
<seewebsiteforem...@erdani.org> wrote:

Besides std.regexp only works with (narrow) strings and we want it to work
on streams of all widths and structures. One pet complaint I have is that
std.regexp puts a class around it all as if everybody's favorite pastime
would be to inherit Regexp and override some random function in it.

So what do you think it should be, a struct?

Yes.

That would imply to me that everybody's favorite pastime is making
value copies of regex structures, when in fact nobody does that.

Well you'd be surprised. The RegEx class saves the state of the last search, which is a sensible thing to do. But then consider a simple range Splitter that, when iterated, nicely gives you...

string a = ",a,  bcd, def,gh,";
foreach (e; splitter(a, pattern(", *"))
    writeln("[", e, "]");

writes

[]
[a]
[bcd]
[def]
[gh]

This is similar to the function std.regex.split with the notable difference that no extra memory is allocated. Now Splitter is an input range. This means you wouldn't expect that you copy a Splitter and then have iterating the original value affect the copy. Well, that's exactly what happens when you use the "good" reference semantics of the RegEx stored inside splitter. Worse, RegExp has no cloning primitive, so I need to resort to storing the pattern and recompiling it from scratch at every copy of Splitter. So essentially the "good" semantics of RegEx are useless when it comes to composing it in larger objects.

Regex is a class in order to give it reference semantics and provide
encapsulation of some re-usable state.  Maybe it should be a final
class, but my impression is "final class" doesn't really work in D.

Re-usable state is provided by structs too. In addition they can choose value vs. reference semantics with ease.


Andrei

Reply via email to