An Invariant WTH?
Kris
foo at bar.com
Mon Nov 5 00:02:30 PST 2007
Chad: sounds like you need Tango for your text processing needs ...
"Chad J" <gamerChad at _spamIsBad_gmail.com> wrote in message
news:fgm0v1$qug$1 at digitalmars.com...
> Daniel Keep wrote:
>>
>> Chad J wrote:
>>> import std.stdio;
>>>
>>> void main()
>>> {
>>> char[] hello = "Hello world!";
>>> writefln( hello );
>>> }
>>>
>>> ----------------------
>>>
>>> main.d(5): Error: cannot implicitly convert expression ("Hello world!")
>>> of type invariant char[12u] to char[]
>>>
>>> ----------------------
>>>
>>> I know that `string hello = "Hello World!";` would cause the desired
>>> results, but this makes me have to learn all about constness and
>>> invariance just to make very trivial programs. More learning curve =
>>> BAD. Also, if I wanted to do an inplace toLower or somesuch on the
>>> "Hello World!" string, then things get more complicated than in 1.0.
>>
>> Trying to do an in-place toLower on "Hello World!" is a *BUG*. The
>> contents of string literals are stored in the data segment, which is
>> supposed to be read-only (apparently not on Windows, though.) If you
>> took that code and tried to run it on, AFAIK, any non-Windows OS, you'd
>> get segmentation faults. Then you'd complain that D didn't catch the
>> error; and if not you, then someone else would, because that's what
>> people have done before! This is one of the major reasons why people
>> want a const system.
>>
>
> Hmmm. I thought the assignment would cause copying, thus it didn't seem
> necessary to have const in this case.
>
>>> It also disturbs me that "string" is just one of "wstring" and
>>> "dstring", and not a more useful generic string type like the dstring
>>> that Chris Miller wrote.
>>
>> I'm not entirely convinced that would be better (although I'm not
>> entirely convinced that it wouldn't.) Once we have implicit
>> conversions, however, you can probably get away with just using a string
>> struct/class in your own code, and automatically convert to the required
>> array type.
>>
>> Personally, I've never had an issue with using straight arrays.
>>
>
> <ramble thats somewhat OT>
> I frequently find myself in this situation where I want to iterate over a
> string, and at the same time be able to index the string an arbitrary
> number of elements ahead or behind the current one. Either that, or I
> want to iterate through 2 strings in parallel, using the same index to do
> operations on both. I forget why these things happen, but they do, and
> foreach is just not adequate for decoding the UTF stuff. By the very act
> of iteration, it does define a way to index UTF8 strings, and I wish that
> definition could be applied to random access. My other alternative is to
> use dchars, which just doesn't work that well with phobos, considering
> everything in phobos uses char[]. I haven't tried writing a dchar[] using
> program with tango yet.
>
> I wish I could be more thorough about this though. I believe it deserves
> more thought on my part. It's also starting to be less relevant to the
> whole const discussion, so I'd rather just leave this at "string the
> keyword can probably be better allocated".
> </ramble thats somewhat OT>
>
>>> Not to mention the massive drain on D community's and Walter's resources
>>> that this has caused.
>>
>> This is true. const is a huge, nasty problem. But keep in mind that
>> before this all started, there were fairly regular posts to the
>> newsgroup asking when D was going to get a const system. A number of
>> people came in here and said they wouldn't even consider using D until
>> it had a const system to back them up.
>>
>> It's not like Walter just got up one day and decided "I think I'll
>> design a new const system!"
>>
>> Well, OK. Maybe he did. But it's not like we weren't bugging him to do
>> so :P
>>
>
> I remember this. Const was going to be great. It doesn't seem to be
> delivering.
>
> Do we have any examples of programs experiencing dramatic bug reduction
> after switching to D2.0? Are there benchmarks proving the performance
> increase?
>
> Well, if the current const system really is considered obsolete, then this
> stuff can probably wait.
>
> My point is that const seemed to be somewhat of an experimental feature in
> D. If the experiment fails, we need to remove it!
>
>>> D2.0 just got closures, and I still get the feeling that I don't like
>>> const.
>>
>> <JohnCleese> I'm sorry, but... this is irrelevent.
>> <MichaelPalin> Leaping from tree to tree down the mighty rivers of
>> British Columbia...
>>
>
> The problem is that D1.0 gets the shaft for new features that it would
> have otherwise benefited from.
>
>>> So I'm wondering if it is irrational to have this feeling that
>>> I'm getting some sort of ugly const thing shoved down my throat.
>>
>> I'll be clear: I want const. I seem to be one of the few people who
>> actually grokked and liked the originally proposed const system. That
>> said, if you don't like something, it's normal to, well... not like it.
>>
>>> Bitching and moaning aside, there's got to be a reason we are doing this
>>> const thing. Something good. Something besides "C/C++ needed it to be
>>> less buggy" - C and C++ tend to need a lot of bug fighting measures in
>>> places that D conveniently doesn't really need much help in. Also,
>>> something besides "it'll make your program 1% faster". I was not
>>> convinced by those.
>>
>> Again, maybe it's just me, but when I write code, I'm constantly
>> thinking to myself "I really wish I had const here." One of the big
>> things it buys you is the ability to express intent. For example, I'm
>> (on and off) writing a full DOM implementation for D. One of the issues
>> is: what to do with string data.
>>
>> My two options are: dup every string that comes in, or just reference
>> it. The problem with the first is that it's much less efficient if I
>> don't need to do those dups. The problem with the second is that it
>> makes keeping my memory profile down much harder: I can never actually
>> tell whether I "own" a piece of memory or not.
>>
>> If I had const, I could make two versions of the setter functions, and
>> only dup if it's actually necessary. This would be a big gain for me
>> not because of the efficiency gain, but because I no longer have to go
>> around worrying about whether a particular method is pass-by-value or
>> pass-by-reference. I no longer have to go and look up "now, am I
>> allowed to change this array, or will that cause Bad Things to happen?"
>> I can actually get the compiler to check for me.
>>
>
> The pass-by-ref vs. pass-by-val seems juicy, but I don't think I
> understand entirely. How does constness solve this? Aren't strings
> ALWAYS referenced to, or are you referring to the reference itself being a
> value or something referred to? A simple code snippet demonstrating this
> would be great (you can refer me to this if it's been done).
>
>>> It's all cost-benefit. I'm seeing a lot of cost with little or dubious
>>> benefit. So why should I be convinced that this is the right thing to
>>> do? Why should I be willing to write D2.0 code?
>>
>> If you're happy with D 1.0, then stick with that (no, this isn't a "if u
>> dont leik it, get lost!" comment.) If you want to use the other
>> features of D 2.0, start writing in it and point out where the const
>> system fails. The example you gave at the start of this post is, in
>> fact, a prime case for *having* a const system, since you didn't even
>> realise you were making a mistake!
>>
>
> Maybe I am stubborn, but that doesn't tell me that D needs a const system.
> It tells me that the way string literals are handled is broken and
> platform dependent.
>
>> Me? I'm going to wait until Walter unveils the changes to the const
>> system. Arguing about something that's already been declared obsolete
>> is somewhat pointless :P
>>
>> -- Daniel
>
> While I am certainly venting a bit about this, I do want to resolve this
> somehow. By "this" I don't mean constness, I mean my personal issues with
> constness. Since const doesn't seem to be going away but rather just
> changing a bit, I am left with one other option: to make me, an angry
> const-hater, into someone who is not an angry const-hater.
More information about the Digitalmars-d-learn
mailing list