Suggestion: object const'ness

Tom ihate at spam.com
Sun May 21 18:50:27 PDT 2006


Hasan Aljudy escribió:
> Tom wrote:
>> Hasan Aljudy escribió:
>>
>>> Tom wrote:
>>>
>>>> Derek Parnell escribió:
>>>>
>>>>> .
>>>>>
>>>>>>
>>>>>> If you see a signature like this:
>>>>>>
>>>>>> void doSomething(in SomeObj obj1, inout SomeObj obj2);
>>>>>>
>>>>>> You'll instantly expect that function "doSomething" doesn't modify 
>>>>>> obj1
>>>>>
>>>>>
>>>>>
>>>>> But it doesn't modify 'obj1'. Remembering that 'obj1' is the 
>>>>> reference to the object and not the object itself.
>>>>
>>>>
>>>>
>>>> If you read just below you'll notice I was referring to obj1 as the 
>>>> object and not as it's reference.
>>>> |
>>>> V
>>>>
>>>>>>    and do possibly modify obj2 (the object and not it's 
>>>>>> reference). Why would you want (in the most of the cases) to make 
>>>>>> "in" the reference itself?
>>>>>
>>>>>
>>>>>
>>>>> Don't know. Simplier I guess.
>>>>
>>>>
>>>>
>>>> Exactly, no one knows why, it's simply useless. At present, in D is 
>>>> perfectly pointless (merely informative) to use 'in' with reference 
>>>> parameters, at least for the 99% of the cases.
>>>>
>>>>>> Currently D 'in Obj p' "behaves as" the rarely-used 'Obj *const p' 
>>>>>> and not as the widely and common 'const Obj *p' of C++ ("behave 
>>>>>> as" because I use pointers instead of references to illustrate the 
>>>>>> underlying behavior and C++ references are always const).
>>>>>>
>>>>>> Const is another level of protection against unintended behavior 
>>>>>> (i.e. bugs). In C++, const *can* be circumvented but one has to be 
>>>>>> horribly explicit to do that. No way you would unintentionally do 
>>>>>> that.
>>>>>
>>>>>
>>>>>
>>>>> So everyone repeat after me ... D is not C++, D is not C++, D is 
>>>>> not C++, ...  ;-)
>>>>
>>>>
>>>>
>>>> I know that Derek. Just that *many* of the users that come to D, 
>>>> don't know if you realize it, comes from the C++ world. It's 
>>>> understandable, we like the features of C++ but hate the syntax (and 
>>>> other stuff) and we see D as a better C++. It's perfectly natural to 
>>>> try to achieve the same things in D that we've achieved in C++. 
>>>> Don't be afraid, I'd hate to see D become another C++ (and that's 
>>>> not gonna happen for sure).
>>>>
>>>> For C++ users, 'in' parameters (for references) are 'const Obj &o', 
>>>> inout/out parameters are 'Obj &o'. When you see that on a signature 
>>>> you can be "sure" (there's always some reasonable trust in the 
>>>> middle) the function will not modify the object (you don't care 
>>>> about the object reference). In D in/out/inout are just a 
>>>> disappointment (for C++ users). I've dreamed to see that keywords 
>>>> used with the same meaning as what I've mentioned above.
>>>>
>>>>> --Derek Parnell
>>>>> Melbourne, Australia
>>>
>>>
>>> "D is not C++" implies the following:
>>> Don't try to achieve things the same way as in C++!!
>>>
>>> It's not just the syntax that's different, it's a lot of features too.
>>> For example: objects are always by reference, never by value.
>>> This make for a huge difference; it results in a completely different 
>>> behaviour in many situations. (for the better).
>>>
>>> I would advice you to try Java for a while, maybe it can help you get 
>>> rid of useless C++ idioms. :)
>>
>>
>> I work with JAVA as well. I like it as a language but I hate its VM, 
>> its gigantic JDK and its slowness. Native compiled Java would be great 
>> if you ask. Anyway I think I get your point.
>> Just a few questions, is in/out/inout useful for you in any way? 
>> Wouldn't it be more honest to remove in/out/inout and replace it for 
>> some kind of 'byref' attribute?
>>
>> Regards,
>> -- 
>> Tom;
> 
> This is just my opinion .. I don't think it's a big deal though, but 
> since you asked, here's what I think:
> I think a "ref" or "byref" keyword would be more meaningful than "inout".
> "in" is the default and shouldn't need a keyword anyway.
> "out" is somewhat similar to inout (see my post/question in the learning 
> NG); it offers no special functionality, and I think it's rarely ever 
> used. so it's really not needed.
> 
> PS: "in" and "out" would still be keywords; they're used in function 
> contracts.

Now, at last what I wanted to hear. That's my point with "true" 
in/out/inout attributes. I mean attributes that aren't useless.
I would propose two options: remove in/out/inout and introduce some 
'byref' or make in/out/inout act as they should with reference types 
(protecting the referenced objects).

This is also just my opinion and isn't a big deal either, just some 
thoughts.



More information about the Digitalmars-d mailing list