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

Reply via email to