gratifiant > comp.lang.* > comp.lang.ada

Blady (11/11/2019, 19h41)
Bonjour,

Dans le manuel Ada, chapitre A.18.28 The Generic Package
Containers.Unbounded_Synchronized_Queues:

package Ada.Containers.Unbounded_Synchronized_Queues is
pragma Preelaborate(Unbounded_Synchronized_Queues);

package Implementation is
... -- not specified by the language
end Implementation;

....

Est-ce que Implementation qui semble indispensable mais ne concerne pas
l'utilisateur ne pourrait-il pas être privé ?

private package Implementation is
... -- not specified by the language
end Implementation;

Quel est votre avis ?

De même : A.18.29 The Generic Package
Containers.Bounded_Synchronized_Queues, A.18.30 The Generic Package
Containers.Unbounded_Priority_Queues et A.18.31 The Generic Package
Containers.Bounded_Priority_Queues.

Merci, Pascal.
J-P. Rosen (12/11/2019, 08h36)
Le 11/11/2019 à 18:41, Blady a écrit :
> Dans le manuel Ada, chapitre A.18.28 The Generic Package
> Containers.Unbounded_Synchronized_Queues:
> package Ada.Containers.Unbounded_Synchronized_Queues is
>    pragma Preelaborate(Unbounded_Synchronized_Queues);
>    package Implementation is


>       ... -- not specified by the language
>    end Implementation;
> ...
> Est-ce que Implementation qui semble indispensable mais ne concerne pas
> l'utilisateur ne pourrait-il pas être privé ?
>    private package Implementation is
>       ... -- not specified by the language
>    end Implementation;
> Quel est votre avis ? Le manuel annoté (AARM) dit:


Discussion: Nested package Implementation can be used to declare the
types needed to implement the protected type Queue. This nested package
is necessary as types cannot be declared in the private part of a
protected type, and the types have to be declared within the generic
unit in order to depend on the types imported with package
Queue_Interfaces. Clients should never depend on the contents of nested
package Implementation.

NB: quand on commence à se pencher sur les points obscurs/épineux du
langage, le manuel annoté est une ressource passionnante...
Blady (15/11/2019, 09h13)
Le 12/11/2019 à 07:36, J-P. Rosen a écrit :
> Le 11/11/2019 à 18:41, Blady a écrit :
> Le manuel annoté (AARM) dit:
> ...
> Clients should never depend on the contents of nested
> package Implementation.


Pourquoi ne pas ajouter private alors ?

Merci Pascal.
J-P. Rosen (15/11/2019, 12h41)
Le 15/11/2019 à 08:13, Blady a écrit :
> Le 12/11/2019 à 07:36, J-P. Rosen a écrit :
> Pourquoi ne pas ajouter private alors ?

Comment ça, rajouter private? Tu veux dire, mettre le paquetage
Implementation en partie privée?

Ce n'est pas possible, car l'idée est d'y mettre des déclarations
nécessaires à la partie privée du type protégé Queue, qui doit être visible.

Note 1: dans un type protégé, on ne peut pas déclarer n'importe quoi, en
particulier on ne peut pas déclarer de type interne. C'est comme dans un
record, ce n'est pas comme dans un paquetage.

Note 2: Tant que le paquetage Implementation ne déclare que des types,
c'est assez anodin si jamais l'utilisateur extérieur les utilise. Il ne
faudrait évidemment pas y mettre des sous-programmes avec un gros
commentaire "NE PAS APPELER" ;-)
Blady (15/11/2019, 22h32)
Le 15/11/2019 à 11:41, J-P. Rosen a écrit :
[..]
> c'est assez anodin si jamais l'utilisateur extérieur les utilise. Il ne
> faudrait évidemment pas y mettre des sous-programmes avec un gros
> commentaire "NE PAS APPELER" ;-)


Je voulais dire ajouter juste le mot clé private devant la déclaration
actuelle ce qui donnerait :

package Ada.Containers.Unbounded_Synchronized_Queues is
pragma Preelaborate(Unbounded_Synchronized_Queues);

private package Implementation is
... -- not specified by the language
end Implementation;

.....

Comme ça pas de possibilité d?appeler le contenu de Implementation par
le programme client. Est-ce correct ?

Merci, Pascal.
Jeffrey R. Carter (16/11/2019, 00h23)
On 11/15/19 9:32 PM, Blady wrote:
> package Ada.Containers.Unbounded_Synchronized_Queues is
>    pragma Preelaborate(Unbounded_Synchronized_Queues);
>    private package Implementation is
>       ... -- not specified by the language
>    end Implementation;
> ....
> Comme ça pas de possibilité d?appeler le contenu de Implementation par le
> programme client. Est-ce correct ?


Seulement les packages qui sont des "compilation units" peut etre private.
J-P. Rosen (16/11/2019, 00h57)
Le 15/11/2019 à 21:32, Blady a écrit :
> Je voulais dire ajouter juste le mot clé private devant la déclaration
> actuelle ce qui donnerait :
> package Ada.Containers.Unbounded_Synchronized_Queues is
>    pragma Preelaborate(Unbounded_Synchronized_Queues);
>    private package Implementation is
>       ... -- not specified by the language
>    end Implementation;
> ....
> Comme ça pas de possibilité d?appeler le contenu de Implementation par
> le programme client. Est-ce correct ?

Ben non. Cette syntaxe n'existe pas pour un sous-paquetage. Seule une
unité de bibliothèque (non contenue dans quelque chose d'autre) peut
être private.
Blady (16/11/2019, 11h15)
Le 15/11/2019 à 23:23, Jeffrey R. Carter a écrit :
> On 11/15/19 9:32 PM, Blady wrote:
> Seulement les packages qui sont des "compilation units" peut etre private.


Bonjour Jeff et Jean-Pierre,

Pourtant GNAT ne s'en plaint pas et n'autorise pas de fait l'accès à T1 :

47. package OP is
48.
49. private package IP is -- private added
50. type T1 is private;
51. private
52. type T1 is new Integer;
53. end IP;
54.
55. protected type PT is
56. entry E;
57. private
58. V : IP.T1;
59. end PT;
60. end OP;
61.
62. package body OP is
63. protected body PT is
64. entry E when True is
65. begin
66. null;
67. end E;
68. end PT;
69. end OP;
70.
71. D : OP.IP.T1;

test32.adb:71:10: error: "IP" is not a visible entity of "OP"

Est-ce un défaut de GNAT ?

Ainsi, ne faudrait-il pas l'autoriser dans le langage ?

Ou sinon augmenter les possibilités de déclarations dans un PO voir une
discussion précédente.

Merci, Pascal.
Jeffrey R. Carter (16/11/2019, 21h07)
On 11/16/19 10:15 AM, Blady wrote:
[..]
> 70.
> 71.    D : OP.IP.T1;
> test32.adb:71:10: error: "IP" is not a visible entity of "OP"


Ce n'est pas "private package IP". C'est "package IP' dans la partie privee d'OP.
Blady (17/11/2019, 11h08)
Le 16/11/2019 à 20:07, Jeffrey R. Carter a écrit :
> On 11/16/19 10:15 AM, Blady wrote:
>             package IP is -- private added
> Ce n'est pas "private package IP". C'est "package IP' dans la partie
> privee d'OP.


Arghhhh oui cela change tout! Merci Jeff pour cet éclairage particulier,
Pascal.
Discussions similaires