[fpc-pascal] Re: Ideas for namespace implementation

Sven Barth pascaldragon at googlemail.com
Mon Jul 26 16:20:32 CEST 2010


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?


   myspace.sysutils; // this sysutils contains an identifier "Exception"

   Exception; // no error
   SysUtils.Exception; // identifier not found
   MySpace.SysUtils.Exception; // no error

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):


   Exception; // no error
   SysUtils.Exception; // identifier not found
   MySpace~SysUtils.Exception; // no error

With RTL's sysutils:

   sysutils, myspace~sysutils;

   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

Hmm... "~" looks ugly :P


More information about the fpc-pascal mailing list