[fpc-pascal] Ideas for namespace implementation
Sven Barth
pascaldragon at googlemail.com
Mon Jul 26 10:14:39 CEST 2010
Hi!
I personally don't have a real opinion pro or against extended
namespace, so I'll try to answer as neutral as possible.
Am 25.07.2010 19:45, schrieb Graeme Geldenhuys:
> 1) Follow the "dotted" notation for unit names as implemented in Delphi.
> (...)
>
>
> 2) Another idea is in a way similar to how compiler defines work. This
> idea tries
> to resolve the problem in (1) with long unit names and with least amount of
> resistance to existing code. A namespace can be applied
> to a single unit, or to a group of units (think of it as a
> "package"). To get this to
> work, we will have to introduce a new keyword and a new compiler parameter.
> Here follows examples of both.
>
> // per unit
> unit utils namespace companyxyz;
> uses
> ...
> end.
>
> ... or applied at compile time to all units being compiled.
>
> // our sample unit - as normal, nothing new
> unit utils;
> uses
> ...
> end.
>
> $ fpc -namespace=companyxyz utils.pas constants.pas ...
>
> ... if a conflict occurs, then you reference the unit with the
> full namespace.
> eg:
>
> uses
> companyxyz.utils; // because unit names must be valid
> identifier and thus,
> // can't contain dots, when the
> compiler sees this, it knows
> // companyxyz. is a namespace reference.
>(...)
>
> 3) Automatically add the directory where the unit is located, as the
> namespace. Similar to what Java does.
>
Regarding your ideas 2 and 3: as they are not Delphi compatible they
might be considered a "bad thing" (TM) by the FPC developers.
The problems of all three (or maybe all namespace ideas) is that they
aren't compatible to older versions of Delphi (and FPC). Even if your
second idea including compiler version checks is used, you'd be back at
the start, because now you'd have a conflicting unit name.
Example:
I'll take the strutils example from rxlib:
unit strutils {$ifdef ver2_6_0}namespace rx{$endif};
(...)
So now we use a 2.4.0 compiler or a Delphi compiler and have a problem:
How can I use the strutils from FPC/Delphi from a unit that uses
strutils from rxlib?
The only solution to this might be
{$ifdef ver2_6_0}
unit strutils namespace rx;
{$else}
unit rxstrutils;
{$endif}
But now it gets ugly regarding uses-Clauses in rxlib itself and units
that use rxlib. :(
Regarding your idea 3:
As FPC can use different directories for the search paths how would you
solve similar hierarchies?
Or a different problem: the source units of FCL packages reside in
packages/$PackageName/src/ while the compiled units are in
units/$Target/$PackageName/. What namespace should apply here?
Where is the base of the namespace? Is it the FPC base dir? What about
units that aren't part of FPC, like fpGUI?
Your idea 3 might become the most complicated one, because of the search
path features that FPC has in comparison to Java.
If I'd have to choose one of your three ideas I'd choose the second one
although it has some backwards-compatibility problems. But there still
might be better ideas out there. :)
Regards,
Sven
More information about the fpc-pascal
mailing list