On Mon, Jul 26, 2010 at 11:20 AM, Sven Barth <pascaldra...@googlemail.com> wrote: > 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
IMHO, is better to use the ':' like myspace:sysutils uses myspace:sysutils; begin Exception; // no error SysUtils.Exception; // identifier not found MySpace:SysUtils.Exception; // no error end. MD _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal