[fpc-pascal] Re: Ideas for namespace implementation
Sven Barth
pascaldragon at googlemail.com
Mon Jul 26 16:20:32 CEST 2010
Hi!
On 26.07.2010 16:06, Martin wrote:
>>> But worst of all
>>> uses sysutils; // the one from my project?
>> No, because the RTL is not compiled with a namespace, so falls under the
>> "global" namespace with takes preference over project units or all other
>> namespaces. This then stays consistent with how developers understood the
>> code as it currently works. Compiler included units take preference.
> You missed the important bit of this section.
>
> let's correct the uses:
>
> uses myspace.sysutils;
> // and only this sysutils, not using the global rtl.sysutils at all
> ....
> begin
> SysUtils.Exception;
>
> Now if any one else is to read/review/... the code => they will not be
> aware of sysutils not being rtl.
> They will assume that "SysUtils.Exception" is "RTL.SysUtils.Exception",
> but it really is "myspace.SysUtils.Exception"
>
> For me,. that is code obfuscation. In order to keep it human
> understandable, the unt name "sysutils" (unqualified) must only be
> allowed to refer to exactly one unit => the one from the rtl, no other
> one ever.
>
> But if we allow the unqualified to only refer to the original rtl one =>
> then all other SysUtils must be fully qualified at any occurence they
> have (even if they are the only SysUtils used in that unit).
> And if the always need full qualification, then they do not differ from
> a prefix (the dot becomes part of the unti name).
What about that the compiler enforces that you use the fully qualified
name if you used it in the uses?
e.g.
uses
myspace.sysutils; // this sysutils contains an identifier "Exception"
begin
Exception; // no error
SysUtils.Exception; // identifier not found
MySpace.SysUtils.Exception; // no error
end.
So the declaration of "myspace.sysutils" declares a new
pseude-identifier. By using a different separator or prefix this could
be made even less problematic for "new users/readers" (I'll chose "~"
now for the sake of example):
uses
myspace~sysutils;
begin
Exception; // no error
SysUtils.Exception; // identifier not found
MySpace~SysUtils.Exception; // no error
end.
With RTL's sysutils:
uses
sysutils, myspace~sysutils;
begin
Exception; // normal resolution of duplicated types, so sysutils wins
(or does the last one win? - I can't remember now...) => no error
SysUtils.Exception // the RTL's Exception
MySpace~SysUtils.Exception; // Exception from MySpace~SysUtils
end.
Hmm... "~" looks ugly :P
Regards,
Sven
More information about the fpc-pascal
mailing list