Discussion:
Clause use dans le corps d'un objet protéger.
(trop ancien pour répondre)
Blady
2018-10-28 15:38:04 UTC
Permalink
Bonjour,

GNAT 2018 n'accepte pas mon emploi de use dans le corps d'un objet protéger:

protected body Text_Buffer is
use Ada.Strings.Unbounded;
^- this declaration not allowed in protected body

Qui y a-t-il de particulier ici pour ne pas accepter une clause use ?

Merci, Pascal.
Jeffrey R. Carter
2018-10-28 18:51:27 UTC
Permalink
Post by Blady
Bonjour,
 protected body Text_Buffer is
    use Ada.Strings.Unbounded;
        ^- this declaration not allowed in protected body
Qui y a-t-il de particulier ici pour ne pas accepter une clause use ?
ARM 9.4(7-8):

7/3
protected_body ::=
protected body defining_identifier
[aspect_specification] is
{ protected_operation_item }
end [protected_identifier];

8/4
protected_operation_item ::= subprogram_declaration
| subprogram_body
| null_procedure_declaration
| expression_function_declaration
| entry_body
| aspect_clause
--
Jeff Carter
"After fifteen minutes I wanted to marry her, and
after a half hour I completely gave up the idea of
snatching her purse."
Take the Money and Run
136
Blady
2018-11-04 09:34:19 UTC
Permalink
Post by Jeffrey R. Carter
Post by Blady
Bonjour,
  protected body Text_Buffer is
     use Ada.Strings.Unbounded;
         ^- this declaration not allowed in protected body
Qui y a-t-il de particulier ici pour ne pas accepter une clause use ?
7/3
protected_body ::=
  protected body defining_identifier
        [aspect_specification] is
   { protected_operation_item }
  end [protected_identifier];
8/4
protected_operation_item ::= subprogram_declaration
     | subprogram_body
     | null_procedure_declaration
     | expression_function_declaration
     | entry_body
     | aspect_clause
Oui, le langage ne le permet pas sans raison explicite de protection
contre un quelconque danger hormis les indéterminations habituelles avec
use.

Salutations, Pascal.
J-P. Rosen
2018-10-29 05:06:56 UTC
Permalink
Post by Blady
Bonjour,
 protected body Text_Buffer is
    use Ada.Strings.Unbounded;
        ^- this declaration not allowed in protected body
Qui y a-t-il de particulier ici pour ne pas accepter une clause use ?
Malgré les apparences syntaxiques, un objet protégé n'est pas
fondamentalement un package, c'est un record (avec des opérations
attachées); et donc, le body ne peut contenir QUE les corps de opérations.

Il est fondamental de ne pas avoir de données dans un corps d'objet
protégé. Pour les clauses use, on pourrait peut-être les autoriser, mais
il suffit de les mettre dans chacune des opérations.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Blady
2018-11-04 09:49:56 UTC
Permalink
Post by J-P. Rosen
Post by Blady
Bonjour,
 protected body Text_Buffer is
    use Ada.Strings.Unbounded;
        ^- this declaration not allowed in protected body
Qui y a-t-il de particulier ici pour ne pas accepter une clause use ?
Malgré les apparences syntaxiques, un objet protégé n'est pas
fondamentalement un package, c'est un record (avec des opérations
attachées); et donc, le body ne peut contenir QUE les corps de opérations.
Il est fondamental de ne pas avoir de données dans un corps d'objet
protégé. Pour les clauses use, on pourrait peut-être les autoriser, mais
il suffit de les mettre dans chacune des opérations.
Oui, en fait je l'ai placé juste au-dessus ce qui est sans doute moins bien.
C'est surprenant que le comportement ne soit pas similaire au corps
d'une tâche par exemple :

task body T1 is
use Ada.Text_IO;
begin
Put_Line ("T1");
end T1;

Salutations, Pascal.
J-P. Rosen
2018-11-05 05:19:09 UTC
Permalink
Post by Blady
Post by J-P. Rosen
Il est fondamental de ne pas avoir de données dans un corps d'objet
protégé. Pour les clauses use, on pourrait peut-être les autoriser, mais
il suffit de les mettre dans chacune des opérations.
Oui, en fait je l'ai placé juste au-dessus ce qui est sans doute moins bien.
C'est surprenant que le comportement ne soit pas similaire au corps
   task body T1 is
      use Ada.Text_IO;
   begin
      Put_Line ("T1");
   end T1;
On ne peut pas mettre de données dans le corps d'un objet protégé, parce
qu'il est fondamental de pouvoir déclarer des objets en ne voyant que la
spec (qui peut être dans une spec de paquetage, dont le corps n'est pas
encore compilé). En n'autorisant que les corps de sous-programmes, on
sait également qu'il ne se passe rien au moment de l'élaboration du corps.

La clause use serait vraisemblablement la seule chose qu'on pourrait
autoriser. Pas assez utile pour faire un exception à une règle simple...
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Continuer la lecture sur narkive:
Loading...