[fpc-devel] Variable can not be initialized by named constant

Daniël Mantione daniel.mantione at freepascal.org
Sun Mar 1 22:34:56 CET 2009



Op Mon, 2 Mar 2009, schreef Alexander Klenin:

> On Mon, Mar 2, 2009 at 03:16, Daniël Mantione
> <daniel.mantione at freepascal.org> wrote:
>
>> Making typed constants writeable has been a disputed feature of the Borland
>> dialect, I agree with that, but fact of the matter is they are writeable and
>> thus cannot form a constant expression. The fact that there exists a $J
>> directive does not change this.
>
> Well, I'd say a better way that, in Delphi, there exists an unfortunately
> designed obscure option to make them writeable.
> I think that that option default is even more unfortunate -- Pascal language
> was always distinguished for its clarity and clean design,
> and 'writeable constants' is neither clear nor clean, IMO.

This is a debate that has been held quite a few times :) If you look at 
typed consts from the point of view what a mathematical constant is, yes, 
it's completely absurd that you can write to them.

But... you need to look at typed consts what they do, and not how they are 
named. If you look at the language feature typed consts from you will see 
that they are not mathematical constants that exists only at compile time. 
If you want a real constant that just has a type you can do something like 
"const x=longint(1)". In contrast with constants, typed consts describes 
actual data that will appear in memory.

The compiler cannot prevent you writing to data in memory, since at 
runtime, the coder is the boss. All you need is to cast them into a 
pointer. Works flawlessly, regardless of the $J state. From this point of 
view of the function typed consts form, allowing writes to them isn't that 
illogical.

> First, allowing to write to a constant is much more aesthetically
> unpleasant to me.
> Actually, Free Pascal is the almost the only language I know
> (besides assembler and FORTRAN IV) allowing such break-of-contract by default,
> without the need of any casts or pointers.
>
> Second, I do NOT suggest to convert declaration into an assignment.
> As you correctly noted, it is debatable whether such a feature is good or
> bad for the language.
> Although I personally think that benefits outweigh the costs, this is
> totally separate topic.
> What I suggest is to:
> 1) Disallow changing of constants, making them worth their name
> 2) Allow using of typed constants at the same places as untyped ones,
>  including initializer expressions.
> This should not affect code generation at all, just parsing an constant folding.

Remember again that:

const x:longint=1;    {Defines a location in memory large enough to
                        hold an integer, which contains value 1.}
       y=longint(1);   {Defines a compile-time symbol that is equavalent to
                        writing longint(1) somewhere in the code.}

... do completely different things inside the compiler.

It will affect code generation, since typed consts are stored in memory. 
There exists no constant folding for typed consts, because they need to be 
layed out in memory exactly as the programmer describes, the compiler 
cannot mess with that unlike with real compile-time constants. Basically 
code has to be generated that reads the typed consts from their fixed 
position in memory and copied into the variable.

Of course disallowing writing to typed consts is problematic because of 
people making use of this functionality. After all, typed consts existed 
long before initialized variables were invented and I'm sure people are 
still using them.

Daniël


More information about the fpc-devel mailing list