[fpc-devel] Namespaces [was: is that intended? private type section in classes versus visibility]
Graeme Geldenhuys
graemeg.lists at gmail.com
Mon Jul 26 10:22:47 CEST 2010
Op 2010-07-26 02:45, Hans-Peter Diettrich het geskryf:
>
> How should that work? How to distinguish between <std>utils.pas and
> <other>utils.pas, in "using utils;"?
I'm thinking in the line of working with something like Lazarus Packages.
This is not limited to Lazarus only though. When I talk about a "lazarus
package" I mean a set of code (units) that act as one "library" in a sense.
Lets use a Lazarus Package (*.lpk) as a simple example.
We have a lazarus package named: fpgui_toolkit.lpk
Compile that package with '-namespace=fpgui' and all compiled units are
output to a 'lib' directory.
Now we have a project that uses that Lazarus Package as a dependency,
referencing the already compiled units directory 'lib' from the
fpgui_toolkit.lpk package (this means compiling this project doesn't need
to compile the fpGUI toolkit units - they are already compiled). Now lets
say this project also contains a utils.pas (fpgui_toolkit.lpk also
contained a utils.pas unit). Now if this project wants to reference the
utils.pas from fpGUI package, it would use the <namespace>.<unitname>
format in the uses clause. If this project only used 'uses utils;' then it
would reference the utils.pas of this project (part of the "global"
namespace which takes priority" because this project was not compiled with
a -namespace= parameter.) and not of the utils.pas in the fpgui_toolkit
package.
eg:
uses
utils, // utils.pas from this project - part of "global" namespace
fpgui.utils, // utils.pas from "fpgui" namespace
sysutils;
No if our current project didn't contain a utils.pas unit, then we could
simply reference the utils.pas from fpGUI package without the need for the
namespace prefix.
eg:
uses
utils, // only utils.pas the compiler knows about (based on
// search/library paths is the one in "fpgui" namespace.
sysutils;
See, no need for a global system wide cache like .NET Simply use the search
and library paths passed to the compiler. 3rd Party code (like the
fpgui_toolkit.lpk package) must be compiled separately if you want them to
have a different namespace from the current project. Alternatively, all
units must define the namespace they belong to, inside the unit on the
'unit' line. Then you don't need to pre-compile 3rd party units.
eg:
unit fpg_button namespace fpgui;
uses
...
end.
Regards,
- Graeme -
--
fpGUI Toolkit - a cross-platform GUI toolkit using Free Pascal
http://opensoft.homeip.net/fpgui/
More information about the fpc-devel
mailing list