[fpc-devel] Suggestion for change: Overly strict check

Christian Iversen chrivers at iversen-net.dk
Wed Sep 27 22:36:42 CEST 2006


Hi all.

I was hoping there could be a discussion of a certain feature in FPC, which 
doesn't work very well for us. Ultimately, I would like to see it gone 
completely. It's a very small extra-strong syntax check, appearantly 
implemented to avoid bad code. However, it's not entirely obvious why this is 
supposed to help.

Please consider this example:

type
  tfoo = class(tbar)
  private
  public
    procedure Frob();
    procedure Wait(delay: integer);
    procedure ReadStuff(buffer: tbuffer; wait: boolean);
  end;

When declaring classes or interfaces, it is specifically checked that the 
names of methods are NOT the same as _any_ variable name of _any_ other 
method in the class. This means that the example above will NOT compile.


Now, in Delphi mode this check is not performed, and so the code above will 
compile without problems.


The reason for keeping this check, as far as I know, is that it's supposed to 
lead to better code. For instance, in the body of ReadStuff(), the 
identifier "wait" could be potentially confused between the "boolean" 
parameter, and the "procedure(delay: integer) of object;". 

At least, that's the theory. Of cours, if the parameter "wait" was a "function 
(delay: integer) of object", there could be some confusion. This is very 
rare, however - and you have to be careful anyway, because this restriction 
is not consistent: 

var
  wait: boolean;

procedure tfoo.ReadStuff(buffer: tbuffer; wait: boolean);
begin
  // In here, wait could refer either to the parameter, or the global var. 
end;

However, it's not confused with the global var, because standard scoping rules 
apply. Same as with inner functions and such. Also, if you have a unit foo, 
with a variable bar, you can use "foo.bar" to refer to that specific var. 
However, "foo.bar" could also refer to the local record "foo" with the 
field "bar". Again, standard scoping rules solve this problem without 
incident.

The _real_ problem, however, is that with these very strict checks we 
essentially only have one namespace for each class/interface. All function 
names, parameter names AND local variable names share ONE namespace, with the 
one exception that no check is performed between functions.

We have several examples where good, standard names are used for functions, 
and then cannot be used in local variables - this is even though they could 
never be confused in any realistic scenario.

We urge you to rethink the introduction of these checks. It's making it 
tremendeously difficult for us to change our code to objfpc mode, and 
removing it would not break a single line of code anywhere. We have to 
rethink quite many variable and/or function names, because many good names 
are already taken. This is, in effect, making our code quality slightly worse 
overall.

What are your thoughts on this? 

-- 
Regards,
Christian Iversen,
Ivo Steinmann



More information about the fpc-devel mailing list