[fpc-pascal] How to avoid namespace name clashes after USES ?
terminatorul at gmail.com
Mon Aug 20 18:15:41 CEST 2012
As the language is currently specified, an identifier is searched in,
and used from, the last unit in the USES clause that exposes that
As some might know already, this exposes the user to future
compatibility problems, stemming from the fact that the USES clause
imports and "open namespace" into the user program.
Imagine my perfectly tested scientific computations program uses two
third-party units: Math and Trig. Currently only the Math unit exposes a
log() function that computes the base e (that Euler number) logarithm of
the given argument. All is so good and nice and I get promoted or I get
to another project or to another company and leave the code on the
An year later a new version of Trig unit is available, the company
promptly upgrades it and after some time someone else needs to make some
changes to, or just re-compile for porting or other resons, the initial
scietific computations program.
Now Trig also exposes a new log() function, which computes the base 10
logarithm for its given argument. Now Trig appears last in the USES
list, after Math.
With no error messages, or even with no changes to the program since 1
and a half year in the repository, the scientific calculations are now
all blown up, and program outputs only errors at runtime. The maintainer
now curses and chases me for having the nerve to leave a program
known as working in such a horrible mess in the repository.
Of course this is a particular case, and in the general case it is most
likely I will get some compilation error, if a unit that appears later
in the USES clause suddenly now defines a previous symbol, that I make
use of in my program. But still, if the program never changes (on
git/svn/cvs), it should still compile later, as it stands...
This story is inspired from a real case when *lots* of user code
suddenly stopped compiling after JDK 1.2 was released, with a new List
class, which users had to import from a different package until JDK 1.1.
In this case is wasn't even a third-party library that triggered
conflicts in existing code, it was the system run-time library. Since
that story most Java programmers prefer to import and enumerate each and
every class they use explicitly, instead of importing the package that
provides the classes (I believe there is no equivalent feature in Pascal
that imports only one symbol from a unit).
Is there any form of proposal or some alternative to the USES clause,
that will keep all the imported symbol names qualified by some namespace
name or by some prefix I choose ?
import System into sys, Math, Trigonometric into trig;
and then I would need to use trig.actg() as the only possible way to
refer to actg() function in the Trigonometric unit, and to use
Math.log() for logarithm ?
Yes, I know I can qualify names even now if I so choose, but I was
thinking for a way to ensure that qualified names are the only
possibility, and a way that will allow me some shorter qualification,
because with the current qualified names, the qualified name can be
More information about the fpc-pascal