Generic const - a non-functional view

Me Here p9e883002 at sneakemail.com
Thu Jun 26 16:37:52 PDT 2008


Dee Girl wrote:

> Steven Schveighoffer Wrote:
> 
> > 
> > "Bill Baxter" wrote
> > > Me Here wrote:
> > >> Walter Bright wrote:
> > > > 
> > >> Perl has invariant strings, but they are implicitly invariant
> > >>> and so nobody notices it, they just work.
> > > > > 
> > >> Sorry Walter, but thta is simply not the case: Vis:
> > > > 
> > >> [0] Perl> $x = 'x' x 500e6;
> > >> [0] Perl> print length $x;;
> > >> 500000000
> > >> [0] Perl> substr $x, 250e6, 1, 'y';;
> > >> [0] Perl> print length $x;;
> > >> 500000000
> > >> [0] Perl> print substr $x, 250e6-5, 10;;
> > >> xxxxxyxxxx
> > > > 
> > >> b.
> > > 
> > > What are you disagreeing with?
> > > 
> > > The fact that they're invariant?
> > > Or the fact that nobody notices?
> > > 
> > > I have no idea if they're invariant in perl or not.  But I don't think 
> > > your test above is conclusive proof that they're mutable.
> > 
> > No it's not.  The only conclusive proof comes from observing what happens 
> > when you copy strings from one to the other:
> > 
> > #!/usr/bin/perl
> > 
> > print "before x\n";
> > sleep 20;
> > $x = 'x' x 100000000;
> > print "initialized x\n";
> > sleep 5;
> > $y = $x;
> > print "copied to y\n";
> > sleep 5;
> > substr $x, 3, 1, 'y';
> > print "did substring\n";
> > print substr $y, 0, 5;
> > print "\n";
> > sleep 5;
> > 
> > OK, so what does this do?  I set x to a string of 100 million x's, then 
> > assign x to y, then replace the 4th character in x with a 'y', then print 
> > the first 5 characters of y to see if they changed too (see if x and y 
> > reference the same data)
> > 
> > So what does this output?
> > before x
> > initialized x
> > copied to y
> > did substring
> > xxxxx
> > 
> > But this is not yet conclusive proof, we need to watch what happens with 
> > memory usage when each step occurs (hence the sleeps).  So using 'top', I 
> > observed this:
> > 
> > before x => mem usage 3k
> > initialized x => 191MB (!)
> > copied to y => 291MB
> > did substring => 291MB
> > xxxxx
> > 
> > So, what it looks like is on assignment, the string is copied, and the 
> > editing edits the string in-place.   But I can't really explain why it
> > takes 191MB to store x, where it only takes 100MB to store y.
> > 
> > So I'd say perl does not have invariant strings.  'course, I'm not a perl 
> > hacker, so I don't know if I did this correctly :)
> > 
> > -Steve 
> 
> Hello! I think the first part of your message is correct. the second is maybe
> mis guided. Walter is correct. Perl strings do not have mutable chars. They
> can be think as similar to D strings. Your example with $x and $y shows that.
> 
> Perl can optimize copies sometimes. But it does not matter. Semantics is all
> that matters. And Perl strings can not mutate individual chars ever. Thanks,
> Dee Girl

Utter baloney.

b.

-- 




More information about the Digitalmars-d mailing list