[fpc-pascal] private type and type compatibility

Sven Barth pascaldragon at googlemail.com
Thu Oct 31 15:58:05 CET 2013


Am 31.10.2013 15:41, schrieb Frederic Da Vitoria:
> 2013/10/31 Sven Barth <pascaldragon at googlemail.com 
> <mailto:pascaldragon at googlemail.com>>
>
>     Am 31.10.2013 14:42, schrieb Frederic Da Vitoria:
>>     2013/10/31 Sven Barth <pascaldragon at googlemail.com
>>     <mailto:pascaldragon at googlemail.com>>
>>
>>         Am 31.10.2013 12:38, schrieb Frederic Da Vitoria:
>>>         2013/10/31 Sven Barth <pascaldragon at googlemail.com
>>>         <mailto:pascaldragon at googlemail.com>>
>>>
>>>             Am 31.10.2013 02:45, schrieb Xiangrong Fang:
>>>>             2013/10/30 Jonas Maebe <jonas.maebe at elis.ugent.be
>>>>             <mailto:jonas.maebe at elis.ugent.be>>
>>>>
>>>>
>>>>                 This is not equivalent. A private type declaration
>>>>                 in a class adds a new identifier that is visible
>>>>                 inside that class. You then use it, still in that
>>>>                 class, to declare the return type of a function.
>>>>                 Next, in a scope where that type identifier is no
>>>>                 longer visible, you call the function.
>>>>
>>>>                 My example is a complete match to that scenario as
>>>>                 far as identifier visibility is concerned (you use
>>>>                 a type in a scope where it is visible to declare a
>>>>                 function return type, and then call the function in
>>>>                 a scope where it is not visible). In your example,
>>>>                 the type is not visible in the place where the
>>>>                 function is declared but only where it is defined
>>>>                 .
>>>>
>>>>
>>>>             This is logically WRONG. Because to the machine, any
>>>>             function return value can be seen as an array of bytes,
>>>>             for example, a pointer is array[0..3] of Byte on a
>>>>             32-bit machine.  The purpose of type system is to
>>>>             explain what these bytes stands for. So, if a type is
>>>>             out-of-scope, how do you interpret the data?
>>>>
>>>>             The current "delphi compatible" implementation IS using
>>>>             the type information to compile the program, i.e.
>>>>             although it is not visible, it is indeed used by the
>>>>             compile, which, in my opinion, violates visibility rules.
>>>>
>>>>             Standing on your view point, if a type is no longer
>>>>             visible, but a variable (function return value) of that
>>>>             type is in current scope, and understood by the
>>>>             program, this means, this value itself carries type
>>>>             information!  Is is kind of meta data available in
>>>>             Pascal? If so, I think RTTI should work for ANY kind of
>>>>             primitive data types.
>>>>
>>>             For unit interfaces there is indeed the point that if
>>>             unit A uses unit B then the program which uses unit A
>>>             will be able to access types used by unit A. E.g.:
>>>
>     ...
>
>>>             It's this way at least since Turbo Pascal (though
>>>             without classes then ;) ).
>>>
>>>
>>>         Yes, I agree this is the TP/Delphi way, and as such should
>>>         be kept at least in DELPHI mode. But is this really good?
>>>         Doesn't this contradict the Pascal philosophy? Borland did a
>>>         few questionable things (look at how you used the semicolons
>>>         in you examples above ;-) ), and it took some decisions when
>>>         implementing units. But how is this handled in Modula?
>>         Undoing this even for only non-TP/Delphi modes would mean
>>         adjusting very much code out there. So no, this is how Object
>>         Pascal works.
>>
>>
>>     Ah, you mean that this is too much intricately mixed with the
>>     compiler code and it would be much too much work to change? OK,
>>     this I understand :-)
>>
>     It's not about being mixed with the compiler code it's about too
>     many legacy code relying on this behavior, because it's a given
>     since TP times.
>
>
> ...and this modification would only become relevant for new code, so 
> quite probably not worth the compiler extra code. Yes, I can 
> understand this too. But my question was not about changing the 
> behavior of fpc (not any more). This was a theoretical question. In 
> other words, if you had been in a position to create TP back in 
> nineteen something, and if one of your main concerns had been about 
> respecting the Pascal philosophy, how would you have handled this? The 
> way it has been done? Or do you agree this was not quite orthodox 
> (although efficient)?
I honestly don't know what I would have done...

Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20131031/00a4ef1d/attachment.html>


More information about the fpc-pascal mailing list