[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