Hello As the language is currently specified, an identifier is searched in, and used from, the last unit in the USES clause that exposes that identifier.
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 repository. 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 ? Something like: 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 really long. Thank you, Timothy Madden _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal