On Mon, Aug 20, 2012 at 1:15 PM, Timothy Madden <terminato...@gmail.com> wrote: > 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
I feel your pain. A long time ago this topic was talked here, on the list, and many ideas were proposed... but none was accepted or because no one will implement it. I proposed this sintaxe: uses my_long_unit_name as my; begin my.proc(); end Simple, clean and easy. But I do not know how implement this on the compiler. IMHO, without changing the language, only the compiler could use "simple names". All others third-party library -- even Lazarus -- should use prefixes in ALL identifiers in the unit, unfortunately. Marcos Douglas _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal