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
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal