On 1-dic-10, at 12:10, spir wrote:
On Tue, 30 Nov 2010 23:57:04 +0100
Fawzi Mohamed <[email protected]> wrote:
Speaking about D mistakes Steve spoke about missing tail const.
I was thinking about this, and I fully agree that it is a hole.
I don't know if it was already discussed, but I was thinking that one
could introduce
*const T t1;
and
*immutable T t2;
with the following meaning:
const or immutable is applied on the "dereferenced" type. For classes
this would mean the object, not the pointer.
Thus for example if T is a class type one would be able to reassign
t1
t1=t2;
but not to modify the content of t1 or t2 in any way.
One can also extend it to array types: if T is U[], then it would
mean
const(U)[] or immutable(U)[], and to pointer types,
*const int* would then mean const(int)*.
For other types maybe the best solution would be to
drop the const/immutable for basic types, functions and delegates
apply it to all fields of a struct (not sure how much work this
would
be to implement)
This use of * should not introduce much ambiguity (a pointer is T*,
indeed also const*T would be almost as unambiguos).
It seems, as Andrei pointed (!) a few days ago, that the issue is
purely syntactic. Namely, since class instance de/referencing is
completely implicit _including_ in class definition and variable
declaration, there is no way to denote constness on the pointer's
target. As you show, we do not need any new lexical or syntactic
artifact for arrays or explictely pointed thingies.
This is in contrast with languages in which class instance
dereferencing is implicit, to access slots:
o.someAspect = 1
write(o.someComputedData());
o.doSomething();
but type definition is explicitely pointed.
As an example, defining a list/node type in Oberon would look like:
TYPE
Node = POINTER TO NodeData;
NodeData = RECORD
next : Node;
value : int;
END ;
(Oberon records are a mix of D structs and classes: value types like
structs, but with inheritance and runtime-type method dispatch.)
Then, if Oberon had 'const', it could use the same syntax as for
pointed arrays, for instance, to apply const on either a "class
instance" (pointer to object data) or to the data properly speaking.
I'm not advocating for having D define classes that way ;-) Not even
that D allows it as an alternative, just to be able to apply const
on elements of the target type (*). Rather, I mean that a seemingly
good idea (implicit referencing of class defs) may lead to
unexpected consequences in practical coding.
yes indeed, but I would say (as I have just argued in another post)
that having a weak const would be useful also for structures, at least
for the user (while maybe possible it would be difficult for the user
to build a weak const for a structure, as it implies defining another
equivalent structure with different access qualifiers).
Denis
(*) For instance:
alias class(NodeData) Node;
-- -- -- -- -- -- --
vit esse estrany ☣
spir.wikidot.com