alternative aliases [Re: [fpc-devel] Re: [fpc-pascal] Re: Ideas for namespace implementation]

Martin fpc at mfriebe.de
Tue Jul 27 14:57:57 CEST 2010


On 27/07/2010 13:28, Alexander Klenin wrote:
> On Tue, Jul 27, 2010 at 21:35, Martin<fpc at mfriebe.de>  wrote:
>    
>> especially for the namespace (see the wiki page too), it solves the
>> difference between
>>
>> uses Foo in 'LCL'; // a folder called lcl, in the project
>> uses Foo in LCL; // the namespace
>>      
> I agree that resolving ambiguity is a good thing, but still
> think these two usages are confusingly similar.
> In other words, I see this as a (not very strong) argument in favor of
> dotted notation -- there is no chance of confusion between
> "uses Foo in 'LCL'" and "uses LCL.Foo", and maybe even
> "uses LCL.Foo in 'my/math/to/lcl'"
>
>    
I understand your argument for LCL.Foo => and IMHO it's amatter of 
personal taste.

- LCL.Foo is more distinct from Foo in LCL
- but Foo in LCL looks more familiar (well matter of taste)
- Foo in LCL => allows to later use Foo.LCL in mode delphi to implement 
the delphi thing for compatibility

For the 3rd example:
The namespace LCL is a specification of a location (only by means of an 
alias). Therefore  "uses LCL.Foo in 'my/math/to/lcl'"  makes not much 
sense: "Foo in LCL in 'my/math/to/lcl'" => You can only give one 
location for Foo.


>>   In the uses clause the dot as no ambiguity . In the source it can have (see
>> many earlier mails)
>>      
> I see this argument as very weak.
> Ambiguity is unavoidable both with and without namespace, nothing can
> prevent it.
>    
uses Foo as RxFoo;
...
begin
   RxFoo.bar

is only ambiguous, if in addition to the unit (via alias) there is a 
type RxFoo. (and then it's the fault of the person who choose the alias....)

- It can not be ambigious with a namespace, if no namespace is 
allowed/expected in the source
- It can not be ambigious with another unit, since it's unit in the list 
of both uses-clauses, must have a unique name .
     uses LCL.Foo, RTL.Foo;
is not allowed and gives an error. => both units must be given an unique 
alias (in theory one would be sufficient, but forcing both may be a good 
idea)


> The important things are that:
> 1) It is detected by compiler
> 2) It is easily resolved by programmer with minimal hassle
>    
change the alias => easy
> I think allowing qualified unit names in the source helps (2),
>    
Can't see how? The alias is same as good. (If you consider the above 
rules about it's uniqueness)

> and (with proper implementation) does not change (1).
>    
yes, but neither does the alias.


>>   In the source, the unit should only be known by either it's name, or if
>> aliased by it's alias only.
>>      
> This a can agree -- once you introduced the alias, you should
> convert all the usage to it. I just want to allow using qualified names as well.
>    

As explained above => I am strictly against it => and this statement was 
meant to underline the "no qualified" statement.


>>> uses
>>>    FooLCL=LCL.Foo, RTL.Foo;
>>>        
>> possible =>  but not my favourite
>>
>> rather shorten "qalias" to "as"
>> uses LCL.Foo as LCLFoo
>>      
> I still prefer my bikeshed color ;-)
> Currently, "as" keyword means "convert to a different type",
> while "=" already has "alias" meaning when applied to types.
> I think overloading "as" to mean "alias" is not optimal from
> language design POV.
> Still, this is trivial matter, so it may go either way.
>    
I listed all possibilities.

But yes the final details of the syntax are not the most important for 
now....


>>> begin
>>>     FooLCL.proc();
>>>        
>> yes
>>      
>>>     RTL.Foo.proc();
>>>        
>> no,no,no
>> The beauty of the alias is, that the pascal source remains pascal, and not a
>> new form of java or C
>>      
> Do you think allowing more than one level of nesting is
> a privilege of Java? ;-)
>    
Not Java only....

But the question is, do we really want to look at a wide selection of 
other languages (including java and C++) and copy all possible features?
There is a difference between extending pascal, and creating a 
completely new language... We have a tendency to go to the new language....

>> also RTL.Foo.proc is ambigious.
>>
>> there could be a
>>   unit RTL;
>>   type Foo=class
>>     class procedure proc;
>>   end;
>>      
> So what? It can already be written (with types instead of namespaces),
> and is already ambiguous.
> (BTW, currently fpc resolves ambiguity by preferring unit over type.
> I think it should at least issue a warning).
>    
The fact that some ambiguity exists does not mean that we should seek to 
extend this.

And also it is not a matter if the compiler can deal with this, never 
mind if that is:
- resolving by some rule (with/without hint/warning)
- aborting with error

For a compiler it is easy to follow a rule that deals with it.

but for the developper each possibility of creating ambigiuty, decreases 
readability of the code. And a developper can not resolve the ambiguity 
as good, quick, or correct as the compiler can.

Not meaning to repeat the developper-shot-himself-in-foot thread. True 
we can not stop the developper from doingso, if he wants to. But should 
we supply him with extra ammunition, in case the first bullet misses the 
target (foot)?





More information about the fpc-devel mailing list