On 26/07/2010 14:44, Graeme Geldenhuys wrote:
Please note: I did not say my ideas are perfect, just that they are
suggestions that was put out there. Discussions regarding namespaces and
ideas/suggestions need to filter out the finer details of what could or
couldn't work. This is the whole point of this discussion at this stage.
Which is why I add examples, and question, instead of saying "I dislike it, simply because I wish to annoy you" ;>

SCNR

lets say we have:
rtl:   classes, sysutils,  but *not* foo
rxlib:   sysutils, foo    (all in namespace rx)
mylib:   foo   (namespace my)
It the my project itself:   sysutils, my   (no namespace?)

uses classes;    // the one from rtl
uses sysutils;    // the one from my project?
...
In your example above, sysutils inside the project conflicts with the
sysutils of the rtl, so the project will have to define a namespace for its
sysutils
ok

uses rc.foo, my.foo, my; // there is a unit my
...
begin
    foo.a; // error, which foo?
    my.foo.a; // is that unit my, record foo.a OR unit my.foo ?
Good point, I haven't thought that far.
It's from the mantis issue, that you quoted...

I only worked though of the uses
clause.  Maybe when referencing a namespace we need a different syntax?
Something that distinguishes between a<unit name>.<var or record>
reference and a<namespace>.<unit name>  reference.

I'm not sure what will fit nicely in the Object Pascal language. Generics
already uses the<  and>   characters. The _ is not allowed as the starting
character of a unit name, so maybe that could be used? Or maybe the #
character?

eg:
   uses
     rc.foo, my.foo, my;
   ...
   begin
     foo.a;  // is the<unitname>.<var or record>  syntax
     _my.foo.a; // is<namespace>.<unit name>.<var or record>  syntax.
Devil's advocate: Why not using the "_" as separator:
  my_foo.a  // a in my_foo
  my.foo.a; // record foo int my

...not sure if _ should be used in the uses clause as well for consistency.
Currently a '.' (dotted) unit name is not allowed in the uses clauses, so
FPC could know that a 'rc.foo' means<namespace>.<unit>. But consistent
syntax is probably better, so the uses clause will change to.

   uses
     _rc.foo, _my.foo, my;

Second suggestion is changing the _ character to a # character, but then
again, that conflicts with a hex char notation, so is probably not a good idea.
I do not think, that prefixing namespace identifers (# or _) is a good idea at all. If anything like this, then use a diff separator

my#foo.a // namespace
my.foo.a // record

# is used for chars (hex is #$) => #foo can ot be a char....

So technically possible, but IMHO messy, very messy

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

Martin




_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to