Boost logo

Boost :

From: Jeff Garland (jeff_at_[hidden])
Date: 2006-07-03 23:21:54


Gennaro Prota wrote:
>
> Hi Jeff,
>
> just to be sure I understood: *the* two reasons for such a class are:
> (a) helping novices (b) having a cleaner (whatever that means) syntax.
>
> Sorry if I'm missing something or oversimplifying the issue. It seems
> to me that (a) is a secondary point, as being a novice is something
> deemed to disappear asap if you want to seriously program in C++; (b)

Well that's too bad indeed, but I think you're wrong on this. For one thing,
the committee is working changes for C++0x to fix long standing issues in C++
to eliminate common mistakes made by novices. Even so, I don't care *that
much* about novices. I just want to be able to write code that *I* can
understand when I read it 3 months later without rereading the string_algo and
regex docs.

> is very nicely obtained with Shunsuke's proposal, which seems to get
> the best of the two worlds: power and syntactical convenience

I'm unconvinced from what I've seen so far.

> (BTW, Shunsuke, is the code in the vault?).

Seems unlikely given that it's a 'future proposal'. The only range algorithms
stuff I know of in the vault was done by Eric N.

> Other points?

Sure. Here's a sanitized fragment of a pretty typical form for a perl script
I've probably written 100 times:

open(IN, "<$filename") || die "File not found $filename\n";

$count = 0;
while ($line = <IN>) {
   chomp($line);
   count++;
   if ($line =~ /^\*\*\*/) {
     $line =~ s/^\*\*\*//;
     $line .= " line: " . $count;
     do_something1($line);
   } elsif ($line =~ /^\*\*/) {
     $line =~ s/^\*\*//;
      do_something($line);
   }
   #...lots more...
}

I believe I can trivially rewrite this using super_string in C++. Due to the
extra escape the regex's are harder to understand, but with some comments it
should be easier to see what is happening then the perl:

std::ifstream infile(...);
super_string line;

unsigned int count = 0;

while (infile.getline(line)) {
   count++;
   line.trim_right();
   if (line.contains_regex("^\\\*\\\*\\\*")) {
       line.replace_regex("^\\\*\\\*\\\*", "");
       line.append( " line: ").append(count);
       do_something(line);
    }
    else {...

I believe with some comments about what the regex's do, mere mortals (or Java
programmers ;-) can read and understand this code. Why should it be any other
way?

Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk