comp.lang.ada
 help / color / mirror / Atom feed
* troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
@ 2018-02-12 16:29 Mehdi Saada
  2018-02-12 17:44 ` Jeffrey R. Carter
                   ` (4 more replies)
  0 siblings, 5 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 16:29 UTC (permalink / raw)


I'm learning POO.
I have trouble, indeed. Please look at this:

if GET_ELEM (TOKEN_COURANT) = '(' then VALIDE;
-->
expected type "T_Token_Operateur" defined
Found type T_TOKEN'Class

The definitions:
 type T_TOKEN is abstract null record ;
   type T_Vect_Token is array (Positive range <>) of access T_Token'Class;

type T_Token_Operateur is new T_Token with
      record
      L_Operateur : T_Operateur;
   end record;

function Get_Elem (Token : in T_Token_Operateur) return T_Operateur is (Token.L_Operateur);
function TOKEN_COURANT return T_TOKEN'Class is
begin
         INDEX := INDEX + 1;
         return V (INDEX - 1).all;
end;
where V : in T_Vect_Token;

What I do: I declare a T_Token'Class as a local variable. Then, according to the content of the array (V), I do things like this:
when '+' | '-' | '*' | '/'
     => V_LOCAL(INDEX_VECT).all := TO_TOKEN(T_OPERATEUR'Value(STRING'(1 => ELEMENT)));
with a different qualified expression for each sub-classes of Token.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 16:29 troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class Mehdi Saada
@ 2018-02-12 17:44 ` Jeffrey R. Carter
  2018-02-12 18:17   ` Mehdi Saada
  2018-02-12 18:40   ` Simon Wright
  2018-02-12 21:39 ` Mehdi Saada
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 35+ messages in thread
From: Jeffrey R. Carter @ 2018-02-12 17:44 UTC (permalink / raw)


On 02/12/2018 05:29 PM, Mehdi Saada wrote:
> I'm learning POO.

What you're learning is type extension. By far most of the questions on here 
where the language doesn't do what is expected deal with anonymous access types 
and type extension. That's because they're parts of the language that are 
counter-intuitive and confusing. You're doing both. Don't do that, and things 
will be much easier.

But if you're taking a course and have to mess with type extension, at least you 
should avoid the access types.

> I have trouble, indeed. Please look at this:
> 
> if GET_ELEM (TOKEN_COURANT) = '(' then VALIDE;
> -->
> expected type "T_Token_Operateur" defined
> Found type T_TOKEN'Class
> 
> function Get_Elem (Token : in T_Token_Operateur) return T_Operateur is (Token.L_Operateur);

That clearly takes a T_Token_Operateur.

> function TOKEN_COURANT return T_TOKEN'Class is

and that clearly return T_Token'Class, just as the error msg said.

It seems you have 3 choices: Make Get_Elem take T_Token'Class, make 
Token_Courant return T_Token_Operateur, or convert the result of Token_Courant 
to T_Token_Operateur.

-- 
Jeff Carter
"You a big nose have it."
Never Give a Sucker an Even Break
107


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 17:44 ` Jeffrey R. Carter
@ 2018-02-12 18:17   ` Mehdi Saada
  2018-02-12 18:24     ` Dmitry A. Kazakov
  2018-02-12 20:25     ` Jeffrey R. Carter
  2018-02-12 18:40   ` Simon Wright
  1 sibling, 2 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 18:17 UTC (permalink / raw)


... Somehow, it doesn't surprise me anymore.

> Get_Elem take T_Token'Class
How could I do that, since it meant to RETURN a different type for each subclass !
> Token_Courant return T_Token_Operateur
I don't even understand. Token_Courant returns the current entry in the vector, entry whose sub-class I can't know beforehand.
> convert the result of Token_Courant to T_Token_Operateur.
Sorry, I don't see the difference with proposition 1

Now, I know why I prefered mutant types even before using them. But since this exercice is explicitely about OOP, I'll stick with the current design.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 18:17   ` Mehdi Saada
@ 2018-02-12 18:24     ` Dmitry A. Kazakov
  2018-02-12 18:42       ` Simon Wright
  2018-02-12 20:25     ` Jeffrey R. Carter
  1 sibling, 1 reply; 35+ messages in thread
From: Dmitry A. Kazakov @ 2018-02-12 18:24 UTC (permalink / raw)


On 2018-02-12 19:17, Mehdi Saada wrote:
> ... Somehow, it doesn't surprise me anymore.
> 
>> Get_Elem take T_Token'Class
> How could I do that, since it meant to RETURN a different type for each subclass !

1. Class /= type. Class is a set of types rooted in a type.

2. T'Class is meant to have values of/equivalent to values of all these 
different types.

3. You can always convert a member of the class (a specific type) to the 
  class-wide type of any class this specific type belongs to.

   type T is ...;
   type S is new T with ...;

   function Foo return T'Class is
      Result : S;
   begin
      return T'Class (Result); -- This is OK
   end Foo;

> Now, I know why I prefered mutant types even before using them.

Mutable instances are always less safe than immutable ones.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 17:44 ` Jeffrey R. Carter
  2018-02-12 18:17   ` Mehdi Saada
@ 2018-02-12 18:40   ` Simon Wright
  1 sibling, 0 replies; 35+ messages in thread
From: Simon Wright @ 2018-02-12 18:40 UTC (permalink / raw)


"Jeffrey R. Carter" <spam.jrcarter.not@spam.not.acm.org> writes:

> What you're learning is type extension. By far most of the questions
> on here where the language doesn't do what is expected deal with
> anonymous access types and type extension. That's because they're
> parts of the language that are counter-intuitive and confusing. You're
> doing both. Don't do that, and things will be much easier.
>
> But if you're taking a course and have to mess with type extension, at
> least you should avoid the access types.

I don't have a view one way or another about access types, but you
(Mehdi) should disregard this advice about avoiding type extension.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 18:24     ` Dmitry A. Kazakov
@ 2018-02-12 18:42       ` Simon Wright
  0 siblings, 0 replies; 35+ messages in thread
From: Simon Wright @ 2018-02-12 18:42 UTC (permalink / raw)


"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:

> On 2018-02-12 19:17, Mehdi Saada wrote:
>
>> Now, I know why I prefered mutant types even before using them.
>
> Mutable instances are always less safe than immutable ones.

Not sure that Mehdi means "mutant" = "mutable".

Though, I don't know what they mean by "mutant".


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 18:17   ` Mehdi Saada
  2018-02-12 18:24     ` Dmitry A. Kazakov
@ 2018-02-12 20:25     ` Jeffrey R. Carter
  2018-02-12 21:18       ` Mehdi Saada
  2018-02-12 21:19       ` Mehdi Saada
  1 sibling, 2 replies; 35+ messages in thread
From: Jeffrey R. Carter @ 2018-02-12 20:25 UTC (permalink / raw)


On 02/12/2018 07:17 PM, Mehdi Saada wrote:
> 
>> Get_Elem take T_Token'Class
> How could I do that, since it meant to RETURN a different type for each subclass !

The type-extension way might be

type Something is abstract tagged null record;

function Get_Elem (Token : in T_Token) return Something'Class is abstract;

type Operator_Something is new Something with record
    Operator : T_Operateur;
end record;

overriding function Get_Elem (Token : in T_Token_Operateur) return Something'Class;

Similar extensions of Something and overridings of Get_Elem for other types in 
T_Token'Class. Then Get_Elem (Token_Courant) will dispatch to the appropriate 
Get_Elem.

-- 
Jeff Carter
"You a big nose have it."
Never Give a Sucker an Even Break
107


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 20:25     ` Jeffrey R. Carter
@ 2018-02-12 21:18       ` Mehdi Saada
  2018-02-12 22:40         ` Simon Wright
                           ` (2 more replies)
  2018-02-12 21:19       ` Mehdi Saada
  1 sibling, 3 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 21:18 UTC (permalink / raw)


the components are all enumeration types of one character, except for T_TOKEN_OPERANDE.OPERANDE who's an INTEGER.
Ahhh... The trick is to encapsulate the components of different types into tagged types, so that they can be grouped together into a class, and so GET_ELEM can be dispatched. That's awfully artifical. Unfortunately, I must keep with the current design,
with things like
type T_TOKEN is abstract tagged null record;
type T_TOKEN_OPERANDE is new T_TOKEN with record
    OPERANDE: INTEGER;
end record;
Besides, I still would need to access the actual inner component of Something, not only OPERANDE_SOMETHING. Even I'm wrong I can't apply that anyway.

I can't believe T_TOKEN'class is as useless... well, in a sense, since the program doesn't know the actual type of TOKEN but only that it's a child of T_TOKEN, no wonder there's some limitations. But I'm surprised there's no mechanism in the language, to tell the program: HEY there ! I'm sure it's T_TOKEN_OPERANDE, so now consider TOKEN as such and let me reach it's OPERANDE component.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 20:25     ` Jeffrey R. Carter
  2018-02-12 21:18       ` Mehdi Saada
@ 2018-02-12 21:19       ` Mehdi Saada
  1 sibling, 0 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 21:19 UTC (permalink / raw)


the components are all enumeration types of one character, except for T_TOKEN_OPERANDE.OPERANDE who's an INTEGER.
Ahhh... The trick is to encapsulate the components of different types into tagged types, so that they can be grouped together into a class, and so GET_ELEM can be dispatched. That's awfully artifical. Unfortunately, I must keep with the current design,
with things like
type T_TOKEN is abstract tagged null record;
type T_TOKEN_OPERANDE is new T_TOKEN with record
    OPERANDE: INTEGER;
end record;
Besides, I still would need to access the actual inner component of Something, not only OPERANDE_SOMETHING. Even I'm wrong I can't apply that anyway.

I can't believe T_TOKEN'class is as useless... well, in a sense, since the program doesn't know the actual type of TOKEN but only that it's a child of T_TOKEN, no wonder there's some limitations. But I'm surprised there's no mechanism in the language, to tell the program: HEY there ! I'm sure it's T_TOKEN_OPERANDE, so now consider TOKEN as such and let me reach it's OPERANDE component.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 16:29 troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class Mehdi Saada
  2018-02-12 17:44 ` Jeffrey R. Carter
@ 2018-02-12 21:39 ` Mehdi Saada
  2018-02-12 21:43 ` Mehdi Saada
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 21:39 UTC (permalink / raw)


why the conversion T_PARENTHESE(TO_TOKEN ('(')) doesn't work ?
Isn't '(' a litteral of both CHARACTER and T_PARENTHESE ?


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 16:29 troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class Mehdi Saada
  2018-02-12 17:44 ` Jeffrey R. Carter
  2018-02-12 21:39 ` Mehdi Saada
@ 2018-02-12 21:43 ` Mehdi Saada
  2018-02-12 22:22   ` Mehdi Saada
  2018-02-13  0:01 ` Mehdi Saada
  2018-02-19 18:10 ` Mehdi Saada
  4 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 21:43 UTC (permalink / raw)


Oh, and by mutant I meant "immutable variant record".


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 21:43 ` Mehdi Saada
@ 2018-02-12 22:22   ` Mehdi Saada
  2018-02-13 17:46     ` Jeffrey R. Carter
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 22:22 UTC (permalink / raw)


I would like this behavior, here in pseudocode, with my current type structures, and still with T_VECT_TOKEN is array (POSITIVE range <>) of access T_TOKEN'Class:

see what character is ELEMENT = EXPRESSION_STRING(INDEX)
if  ELEMENT is '(' then fill in V(VECTOR_INDEX) with T_PARENTHESE'('(') and so one.

Please... please tell me I can keep this definition of T_VECT_TOKEN.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 21:18       ` Mehdi Saada
@ 2018-02-12 22:40         ` Simon Wright
  2018-02-12 23:12           ` Mehdi Saada
  2018-02-13  8:00         ` Stephen Leake
  2018-02-13 17:42         ` Jeffrey R. Carter
  2 siblings, 1 reply; 35+ messages in thread
From: Simon Wright @ 2018-02-12 22:40 UTC (permalink / raw)


Mehdi Saada <00120260a@gmail.com> writes:

> But I'm surprised there's no mechanism in the language, to tell the
> program: HEY there ! I'm sure it's T_TOKEN_OPERANDE, so now consider
> TOKEN as such and let me reach it's OPERANDE component.

There is:

   T_Token_Operande (Token).Operande

But it's much easier to tell the Token to do something, and have it
respond appropriately, than it is to access its internals, which as you
say will be different.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 22:40         ` Simon Wright
@ 2018-02-12 23:12           ` Mehdi Saada
  0 siblings, 0 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-12 23:12 UTC (permalink / raw)


Ah !! Thanks, you made remember I could do, which works:
case GET_ELEM (T_Token_Operateur(I.all)) is
I used to think that conversion from a class-wide type to a child type need not ever be explicit, I was wrong, and it's safer that way of course.
It's better to use as little redispatching or dynamic whatever as possible. I did:

ELEMENT : Character renames STRING_VECTOR(Current_Index);
case ELEMENT is
when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
I could do the same with '+' | '-' | '*' | '/',
but it would suck. I so want something like
when '+' | '-' | '*' | '/' => V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur(ELEMENT));
But the conversion isn't valid, as I said. This is my last error, said the compiler. Thanks to you !

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 16:29 troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class Mehdi Saada
                   ` (2 preceding siblings ...)
  2018-02-12 21:43 ` Mehdi Saada
@ 2018-02-13  0:01 ` Mehdi Saada
  2018-02-13  0:42   ` Mehdi Saada
  2018-02-19 18:10 ` Mehdi Saada
  4 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13  0:01 UTC (permalink / raw)


Ah !! Thanks, you made remember I could do, which works:
case GET_ELEM (T_Token_Operateur(I.all)) is
I used to think that conversion from a class-wide type to a child type need not ever be explicit, I was wrong, and it's safer that way of course.
It's better to use as little redispatching or dynamic whatever as possible. I did:

ELEMENT : Character renames STRING_VECTOR(Current_Index);
case ELEMENT is
when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
I could do the same with '+' | '-' | '*' | '/',
but it would suck. I so want something like
when '+' | '-' | '*' | '/' => V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur(ELEMENT));
But the conversion isn't valid, as I said. This is my last error, said the compiler. Thanks to you.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13  0:01 ` Mehdi Saada
@ 2018-02-13  0:42   ` Mehdi Saada
  2018-02-13  1:32     ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13  0:42 UTC (permalink / raw)


I used to think that conversion from a class-wide type to a child type need not ever be explicit, I was wrong, and it's safer that way of course.
It's better to use as little redispatching or dynamic whatever as possible. I did:
 
ELEMENT : Character renames STRING_VECTOR(Current_Index);
case ELEMENT is
when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
I could do the same with '+' | '-' | '*' | '/',
but it would suck. I so want something like
when '+' | '-' | '*' | '/' => V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur(ELEMENT));

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13  0:42   ` Mehdi Saada
@ 2018-02-13  1:32     ` Mehdi Saada
  2018-02-13  4:16       ` Bojan Bozovic
  2018-02-13 11:28       ` Simon Wright
  0 siblings, 2 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13  1:32 UTC (permalink / raw)


I used to think that conversion from a class-wide type to a child type need t ever be explicit, I was wrong, and it's safer that way of course.
It's better to use as little redispatching or dynamic whatever as possible. I did:
 
ELEMENT : Character renames STRING_VECTOR(Current_Index);
case ELEMENT is
when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
when '+' | '-' | '*' | '/' =>
  V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur'Value (STRING'(1 => ELEMENT)));

The last error (hope none more will pop up !) is
      PUSH (PILE, To_Token(TEMP_PRIORITE.L_Operateur)'Access);
      
considered that 
type PTR_TOKEN_CLASS is access constant T_Token'Class;
package P_PILE_1 is new P_Pile_4 (T_Elem   => PTR_TOKEN_CLASS, Max_Pile => V_ENTREE'Length);
use P_PILE_1, P_Pile_2;
PILE : P_PILE_1.T_Pile(50);

I got "prefix of "Access" attribute must be aliased", which is logical, but how do I aliase the result of a conversion ?

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13  1:32     ` Mehdi Saada
@ 2018-02-13  4:16       ` Bojan Bozovic
  2018-02-13 11:28       ` Simon Wright
  1 sibling, 0 replies; 35+ messages in thread
From: Bojan Bozovic @ 2018-02-13  4:16 UTC (permalink / raw)


On Tuesday, February 13, 2018 at 2:32:42 AM UTC+1, Mehdi Saada wrote:
> I used to think that conversion from a class-wide type to a child type need t ever be explicit, I was wrong, and it's safer that way of course.
> It's better to use as little redispatching or dynamic whatever as possible. I did:
>  
> ELEMENT : Character renames STRING_VECTOR(Current_Index);
> case ELEMENT is
> when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
> when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
> when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
> when '+' | '-' | '*' | '/' =>
>   V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur'Value (STRING'(1 => ELEMENT)));
> 
> The last error (hope none more will pop up !) is
>       PUSH (PILE, To_Token(TEMP_PRIORITE.L_Operateur)'Access);
>       
> considered that 
> type PTR_TOKEN_CLASS is access constant T_Token'Class;
> package P_PILE_1 is new P_Pile_4 (T_Elem   => PTR_TOKEN_CLASS, Max_Pile => V_ENTREE'Length);
> use P_PILE_1, P_Pile_2;
> PILE : P_PILE_1.T_Pile(50);
> 
> I got "prefix of "Access" attribute must be aliased", which is logical, but how do I aliase the result of a conversion ?

You alias the function or procedure, for result to be a pointer, you can't return pointer directly. I don't see all your code but I can provide link

https://en.wikibooks.org/wiki/Ada_Programming/Types/access#Access_to_Subprogram

At least that seems to be a problem. Forgive me if I'm wrong.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 21:18       ` Mehdi Saada
  2018-02-12 22:40         ` Simon Wright
@ 2018-02-13  8:00         ` Stephen Leake
  2018-02-13 17:42         ` Jeffrey R. Carter
  2 siblings, 0 replies; 35+ messages in thread
From: Stephen Leake @ 2018-02-13  8:00 UTC (permalink / raw)


On Monday, February 12, 2018 at 3:18:38 PM UTC-6, Mehdi Saada wrote:
> the components are all enumeration types of one character, except for T_TOKEN_OPERANDE.OPERANDE who's an INTEGER.
> Ahhh... The trick is to encapsulate the components of different types into tagged types, so that they can be grouped together into a class, and so GET_ELEM can be dispatched. That's awfully artifical. Unfortunately, I must keep with the current design,
> with things like
> type T_TOKEN is abstract tagged null record;
> type T_TOKEN_OPERANDE is new T_TOKEN with record
>     OPERANDE: INTEGER;
> end record;

In addition, as Simon pointed out, Get_Elem must be a "primitive operation" of T_Token, and overridden for T_Token_Operande, so it will dispatch on a class-wide object.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13  1:32     ` Mehdi Saada
  2018-02-13  4:16       ` Bojan Bozovic
@ 2018-02-13 11:28       ` Simon Wright
  2018-02-13 12:03         ` Mehdi Saada
  2018-02-13 13:25         ` Dmitry A. Kazakov
  1 sibling, 2 replies; 35+ messages in thread
From: Simon Wright @ 2018-02-13 11:28 UTC (permalink / raw)


Mehdi Saada <00120260a@gmail.com> writes:

> case ELEMENT is
> when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
> when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
> when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
> when '+' | '-' | '*' | '/' =>
>   V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur'Value (STRING'(1 => ELEMENT)));

Well, I would make T_TOKEN contain the first and last indices of the
token in the input string if it'll still be available, or else an
Unbounded_String containing the token text. That way you could probably
avoid a lot of these differences. Of course that wouldn't cover what to
do with numeric or operator tokens. Or those parentheses.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 11:28       ` Simon Wright
@ 2018-02-13 12:03         ` Mehdi Saada
  2018-02-13 13:25         ` Dmitry A. Kazakov
  1 sibling, 0 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13 12:03 UTC (permalink / raw)


I understand, but I can't change the structure that much. I would have to rewrite x packages. Better stick with my solution... It seems sound.
For the aliased thing, I forgot and did that:
EMPILER (PILE, new T_Token_Operateur'(To_Token (TAMPON_PRIORITE.L_Operateur)));
Access to constant means access to a value that is constant, not only to things declared on the stack like A: constant INTEGER := 5. I can still use the heap. I nearly forgot that. Though it's less consistent that I would have liked.

At last it COMPILES without fault.
One last warning:
PILE_PRIORITE : P_PILE_2.T_Pile(50); is initiliazed, and the component that is refered to before calling on "PUSH", HEIGTH has a default value:

T_ELEME is private;
type T_Pile (Le_Max : T_Max) is limited private;
private
type T_Pile (Le_Max : T_Max) is record
    HEIGTH : T_Max := 0; -- en fait entre 0..LE_MAX
    V      : T_Vect (1..Le_Max);
end record;

Can't it see that HEIGTH will never be read uninitialized ?
for I in 1 .. Hauteur (PILE_PRIORITE) loop

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 11:28       ` Simon Wright
  2018-02-13 12:03         ` Mehdi Saada
@ 2018-02-13 13:25         ` Dmitry A. Kazakov
  1 sibling, 0 replies; 35+ messages in thread
From: Dmitry A. Kazakov @ 2018-02-13 13:25 UTC (permalink / raw)


On 13/02/2018 12:28, Simon Wright wrote:
> Mehdi Saada <00120260a@gmail.com> writes:
> 
>> case ELEMENT is
>> when '(' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => '(');
>> when ')' => V_LOCAL (I) := new T_TOKEN_PARENTHESE'(La_Parenthese => ')');
>> when ';' => V_LOCAL (I) := new T_TOKEN_TERMINATEUR'(Le_Terminateur => ';');
>> when '+' | '-' | '*' | '/' =>
>>    V_LOCAL (I) := new T_Token_Operateur'(L_Operateur => T_Operateur'Value (STRING'(1 => ELEMENT)));
> 
> Well, I would make T_TOKEN contain the first and last indices of the
> token in the input string if it'll still be available,

Right. A source location object would be even better. Actually there is 
no need to keep tokens anywhere because the corresponding lexical calls 
can de done immediately.

> Of course that wouldn't cover what to
> do with numeric or operator tokens. Or those parentheses.

These do not apply to tokens anyway, it is too early to decide at the 
lexical analyze stage. Literals and names/calls/indices come later when 
all tokens are already gone.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 21:18       ` Mehdi Saada
  2018-02-12 22:40         ` Simon Wright
  2018-02-13  8:00         ` Stephen Leake
@ 2018-02-13 17:42         ` Jeffrey R. Carter
  2018-02-13 17:56           ` Dmitry A. Kazakov
  2 siblings, 1 reply; 35+ messages in thread
From: Jeffrey R. Carter @ 2018-02-13 17:42 UTC (permalink / raw)


On 02/12/2018 10:18 PM, Mehdi Saada wrote:
> 
> I can't believe T_TOKEN'class is as useless... well, in a sense, since the program doesn't know the actual type of TOKEN but only that it's a child of T_TOKEN, no wonder there's some limitations. But I'm surprised there's no mechanism in the language, to tell the program: HEY there ! I'm sure it's T_TOKEN_OPERANDE, so now consider TOKEN as such and let me reach it's OPERANDE component.

Given an object V of T_Token'Class, you can do

if V in T_Token_Operateur

and

if V in T_Token_Operateur'Class

and then do a conversion to access the components of the extension. You can also 
compare V'Tag to the tags of the derived types. All of these are frowned on as 
"not the type-extension way" by aficionados of type extension.

-- 
Jeff Carter
"If you don't get the President of the United States on that
phone, ... you're going to have to answer to the Coca-Cola
Company."
Dr. Strangelove
32


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 22:22   ` Mehdi Saada
@ 2018-02-13 17:46     ` Jeffrey R. Carter
  2018-02-13 20:19       ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Jeffrey R. Carter @ 2018-02-13 17:46 UTC (permalink / raw)


On 02/12/2018 11:22 PM, Mehdi Saada wrote:
> 
> Please... please tell me I can keep this definition of T_VECT_TOKEN.

Why? An Indefinite_Vector of T_Token'Class would be better.

-- 
Jeff Carter
"If you don't get the President of the United States on that
phone, ... you're going to have to answer to the Coca-Cola
Company."
Dr. Strangelove
32


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 17:42         ` Jeffrey R. Carter
@ 2018-02-13 17:56           ` Dmitry A. Kazakov
  0 siblings, 0 replies; 35+ messages in thread
From: Dmitry A. Kazakov @ 2018-02-13 17:56 UTC (permalink / raw)


On 2018-02-13 18:42, Jeffrey R. Carter wrote:
> On 02/12/2018 10:18 PM, Mehdi Saada wrote:
>>
>> I can't believe T_TOKEN'class is as useless... well, in a sense, since 
>> the program doesn't know the actual type of TOKEN but only that it's a 
>> child of T_TOKEN, no wonder there's some limitations. But I'm 
>> surprised there's no mechanism in the language, to tell the program: 
>> HEY there ! I'm sure it's T_TOKEN_OPERANDE, so now consider TOKEN as 
>> such and let me reach it's OPERANDE component.
> 
> Given an object V of T_Token'Class, you can do
> 
> if V in T_Token_Operateur
> 
> and
> 
> if V in T_Token_Operateur'Class
> 
> and then do a conversion to access the components of the extension. You 
> can also compare V'Tag to the tags of the derived types. All of these 
> are frowned on as "not the type-extension way" by aficionados of type 
> extension.

Right. It is bad to expose type-specific components. This why Ada offers

    type S is new T with private;

to ensure that clients cannot access internals of the type otherwise 
than through public operations which normally should be operations 
defined on the whole class and thus accessible through dispatch without 
any type conversions and explicit tests.

P.S. There are few cases when Ada design fails and there is a need to 
convert away from the root type. E.g. in class-wide construction 
functions when a specific object is returned as a class-wide. The 
pattern is to create a result and then convert to the specific type to 
initialize.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 17:46     ` Jeffrey R. Carter
@ 2018-02-13 20:19       ` Mehdi Saada
  2018-02-13 21:24         ` Bojan Bozovic
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13 20:19 UTC (permalink / raw)


> Why? An Indefinite_Vector of T_Token'Class would be better.
Because it's my course, and I can rewrite the whole thing, or it would be pointless. I wouldn't use OOP to begin with, if it was me. Plus, I never used containers, so it would be more work/new things, and that's already an awful lot at once. And I would really miss the built-in array slice syntax. I long for the day they add this for containers in the norm. Is it meant in the next one ?

I found that THAT piece, that part of the case statement in the analysis part, is NEVER walked through. I don't get it.

when '1' .. '9' =>
  declare
    FIRST, FIN : NATURAL := 0;
      begin
	Find_Token (CHAINE, TO_SET ("123456789"), INDEX_COURANT, INSIDE, First, FIN);
        PUT_LINE("LONG_VEC_OUT: " & INTEGER'Image(LONG_VEC_OUT) & " INDEX_COURANT:" & INTEGER'Image(INDEX_COURANT));
        V (LONG_VEC_OUT) := new T_Token_Operande'(TO_TOKEN (INTEGER'Value (CHAINE (FIRST .. FIN)))); 
	INDEX_COURANT := FIN;
   exception when others => PUT_LINE ("HERE !");    

The input:
root@debian:~/td travail 18/essai# ./expression < test.in 
45+454;

LONG_VEC_OUT:  1 INDEX_COURANT: 1
LONG_VEC_OUT:  2 INDEX_COURANT: 3
LONG_VEC_OUT:  3 INDEX_COURANT: 7
ICI !
Analyse pass�e
 5 5 5Syntaxe pass�e 
erreur de syntaxe

Something strange happen and operators are not recorded.
In desperation, I published the whole code (I'll change it according to your advice. I think you would need only the second, four and third (to have an exemple).
expression.adb (the test) ! https://pastebin.com/ix2YVrCE
p_expression.adb : https://pastebin.com/i9AAgdwQ
p_expression.ads : https://pastebin.com/Tkba3hJx
p_token.ads : https://pastebin.com/gJT7ggpp
p_token-operande.adb : https://pastebin.com/nL1SrAP9
p_token-operande.ads : https://pastebin.com/eCKgaaBS
p_token-operateur.adb : https://pastebin.com/3EsUeVDp
p_token-operateur.ads : https://pastebin.com/0dLJjRvB
p_token-parenthese.adb : https://pastebin.com/0L7sN7bF
p_token-parenthese.ads : https://pastebin.com/GqFfzfTM
p_token-terminateur.ads : https://pastebin.com/gcpNpuR5
p_token-terminateur.adb : https://pastebin.com/PPZSXC3R

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 20:19       ` Mehdi Saada
@ 2018-02-13 21:24         ` Bojan Bozovic
  2018-02-13 23:03           ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Bojan Bozovic @ 2018-02-13 21:24 UTC (permalink / raw)


You didn't post p_expression.ads but posted body twice, and pastebin deleted most of your code. Consider Google drive, Dropbox or similar, just a single zip or tgz will be simpler than guessing why pastebin deleted your code.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 21:24         ` Bojan Bozovic
@ 2018-02-13 23:03           ` Mehdi Saada
  2018-02-13 23:03             ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13 23:03 UTC (permalink / raw)


Pff, it sucks. You're right, dropbox is very cool.
https://www.dropbox.com/sh/df3yq6gg5jfcubn/AADqyaZ08aQaHsWxn7x6Ng9Ja?dl=0

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 23:03           ` Mehdi Saada
@ 2018-02-13 23:03             ` Mehdi Saada
  2018-02-14  7:00               ` Bojan Bozovic
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-13 23:03 UTC (permalink / raw)


> Why? An Indefinite_Vector of T_Token'Class would be better.
Because it's my course, and I can rewrite the whole thing, or it would be pointless. I wouldn't use OOP to begin with, if it was me. Plus, I never used containers, so it would be more work/new things, and that's already an awful lot at once. And I would really miss the built-in array slice syntax. I long for the day they add this for containers in the norm. Is it meant in the next one ?

I found that THAT piece, that part of the case statement in the analysis part, is NEVER walked through. I don't get it.

when '1' .. '9' =>
  declare
    FIRST, FIN : NATURAL := 0;
      begin
        Find_Token (CHAINE, TO_SET ("123456789"), INDEX_COURANT, INSIDE, First, FIN);
        PUT_LINE("LONG_VEC_OUT: " & INTEGER'Image(LONG_VEC_OUT) & " INDEX_COURANT:" & INTEGER'Image(INDEX_COURANT));
        V (LONG_VEC_OUT) := new T_Token_Operande'(TO_TOKEN (INTEGER'Value (CHAINE (FIRST .. FIN))));
        INDEX_COURANT := FIN;
   exception when others => PUT_LINE ("HERE !");    

The input:
root@debian:~/td travail 18/essai# ./expression < test.in
45+454;

LONG_VEC_OUT:  1 INDEX_COURANT: 1
LONG_VEC_OUT:  2 INDEX_COURANT: 3
LONG_VEC_OUT:  3 INDEX_COURANT: 7
ICI !
Analyse pass�e
 5 5 5Syntaxe pass�e
erreur de syntaxe


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-13 23:03             ` Mehdi Saada
@ 2018-02-14  7:00               ` Bojan Bozovic
  2018-02-14 12:04                 ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Bojan Bozovic @ 2018-02-14  7:00 UTC (permalink / raw)


On Wednesday, February 14, 2018 at 12:03:35 AM UTC+1, Mehdi Saada wrote:
> > Why? An Indefinite_Vector of T_Token'Class would be better.
> Because it's my course, and I can rewrite the whole thing, or it would be pointless. I wouldn't use OOP to begin with, if it was me. Plus, I never used containers, so it would be more work/new things, and that's already an awful lot at once. And I would really miss the built-in array slice syntax. I long for the day they add this for containers in the norm. Is it meant in the next one ?
> 
> I found that THAT piece, that part of the case statement in the analysis part, is NEVER walked through. I don't get it.
> 
> when '1' .. '9' =>
>   declare
>     FIRST, FIN : NATURAL := 0;
>       begin
>         Find_Token (CHAINE, TO_SET ("123456789"), INDEX_COURANT, INSIDE, First, FIN);
>         PUT_LINE("LONG_VEC_OUT: " & INTEGER'Image(LONG_VEC_OUT) & " INDEX_COURANT:" & INTEGER'Image(INDEX_COURANT));
>         V (LONG_VEC_OUT) := new T_Token_Operande'(TO_TOKEN (INTEGER'Value (CHAINE (FIRST .. FIN))));
>         INDEX_COURANT := FIN;
>    exception when others => PUT_LINE ("HERE !");    
> 
> The input:
> root@debian:~/td travail 18/essai# ./expression < test.in
> 45+454;
> 
> LONG_VEC_OUT:  1 INDEX_COURANT: 1
> LONG_VEC_OUT:  2 INDEX_COURANT: 3
> LONG_VEC_OUT:  3 INDEX_COURANT: 7
> ICI !
> Analyse pass�e
>  5 5 5Syntaxe pass�e
> erreur de syntaxe

I get CONSTRAINT_ERROR in p_expression.adb function TOKEN_COURANT. Rethink the whole Syntaxe procedure use loop ...... exit when Condition; end loop; (repeat ... until), because TOKEN_COURANT will increase INDEX beyound V'Last and cause exception when returning v(index).all.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-14  7:00               ` Bojan Bozovic
@ 2018-02-14 12:04                 ` Mehdi Saada
  2018-02-16 23:40                   ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-14 12:04 UTC (permalink / raw)


Ah... Of course, I haven't mastered that part.
For instance, I'm not sure how many times in
	 if TOKEN_COURANT in T_TOKEN_OPERANDE then SUITE;
	 elsif TOKEN_COURANT in T_TOKEN_PARENTHESE then
	    if GET_ELEM (T_Token_Parenthese (TOKEN_COURANT)) = '(' then VALIDE;
	    else SUITE; end if;
	 else OK := FALSE;
TOKEN_COURANT is called. Only once is what I would like, but I code it only assuming, without knowing for sure...

Each subprogram being meant to test one character at once, I wrote that:
procedure SUITE;
procedure SUITE is
   TOKEN_COURANT : T_TOKEN'Class := TOKEN_COURANT_APPEL;
begin
  if TOKEN_COURANT in T_Token_Operateur then VALIDE;
  else OK := FALSE;
  end if;
end SUITE;

But that's not the problem (since it still fails). The recursive design was given by the teacher, and part of the exercice's interest is to teach us that. Eventhough, I find these designs horrible to read and to be avoided at (almost) all costs.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-14 12:04                 ` Mehdi Saada
@ 2018-02-16 23:40                   ` Mehdi Saada
  2018-02-17  1:13                     ` Mehdi Saada
  0 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-16 23:40 UTC (permalink / raw)


As people told me, I switched to containers. Namel, Formal_Indefinite_Vectors.
Instanciated as:
   package P_VECTEURS is new ADA.Containers.Formal_Indefinite_Vectors (Positive, T_TOKEN'Class);
   use P_VECTEURS;
   subtype T_VECT_TOKEN is Vector;
Problem: V.APPEND (TO_TOKEN (T_Operateur'Value (STRING'(1 => ELEMENT))));
gives         "invalid prefix in selected component "TOKEN""
... the heck ?
and for I of V loop -- V being of T_TOKEN'Class type
        64:11 cannot iterate over "Vector"
and TOKEN.ECRIRE; 
        84:30 invalid prefix in selected component "TOKEN"

Isn't Formal_Indefinite_Vectors tagged ??

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-16 23:40                   ` Mehdi Saada
@ 2018-02-17  1:13                     ` Mehdi Saada
  0 siblings, 0 replies; 35+ messages in thread
From: Mehdi Saada @ 2018-02-17  1:13 UTC (permalink / raw)


... Solution: Formal_Indefinite_Vector doesn't implement the Iterator interface, or so says GPS. Just removed Formal_ everywhere... But I don't get why, for the sake of performance, they didn't make it derive from Iterator.


^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-12 16:29 troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class Mehdi Saada
                   ` (3 preceding siblings ...)
  2018-02-13  0:01 ` Mehdi Saada
@ 2018-02-19 18:10 ` Mehdi Saada
  2018-02-19 18:16   ` Simon Clubley
  4 siblings, 1 reply; 35+ messages in thread
From: Mehdi Saada @ 2018-02-19 18:10 UTC (permalink / raw)


Case closed: the calculator is DONE. Hourra !
Stupid task for you, but a milestone for a beginner. Especially on his own.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class
  2018-02-19 18:10 ` Mehdi Saada
@ 2018-02-19 18:16   ` Simon Clubley
  0 siblings, 0 replies; 35+ messages in thread
From: Simon Clubley @ 2018-02-19 18:16 UTC (permalink / raw)


On 2018-02-19, Mehdi Saada <00120260a@gmail.com> wrote:
> Case closed: the calculator is DONE. Hourra !
> Stupid task for you, but a milestone for a beginner. Especially on his own.

Just for the record, making the effort to learn something new (as you
have clearly done) is never a stupid task. :-)

Oh, and well done on completing your project.

Simon.

-- 
Simon Clubley, clubley@remove_me.eisner.decus.org-Earth.UFP
Microsoft: Bringing you 1980s technology to a 21st century world

^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2018-02-19 18:16 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-12 16:29 troubles learning OOP: expected type "Parent.Some_Child", found type Parent'Class Mehdi Saada
2018-02-12 17:44 ` Jeffrey R. Carter
2018-02-12 18:17   ` Mehdi Saada
2018-02-12 18:24     ` Dmitry A. Kazakov
2018-02-12 18:42       ` Simon Wright
2018-02-12 20:25     ` Jeffrey R. Carter
2018-02-12 21:18       ` Mehdi Saada
2018-02-12 22:40         ` Simon Wright
2018-02-12 23:12           ` Mehdi Saada
2018-02-13  8:00         ` Stephen Leake
2018-02-13 17:42         ` Jeffrey R. Carter
2018-02-13 17:56           ` Dmitry A. Kazakov
2018-02-12 21:19       ` Mehdi Saada
2018-02-12 18:40   ` Simon Wright
2018-02-12 21:39 ` Mehdi Saada
2018-02-12 21:43 ` Mehdi Saada
2018-02-12 22:22   ` Mehdi Saada
2018-02-13 17:46     ` Jeffrey R. Carter
2018-02-13 20:19       ` Mehdi Saada
2018-02-13 21:24         ` Bojan Bozovic
2018-02-13 23:03           ` Mehdi Saada
2018-02-13 23:03             ` Mehdi Saada
2018-02-14  7:00               ` Bojan Bozovic
2018-02-14 12:04                 ` Mehdi Saada
2018-02-16 23:40                   ` Mehdi Saada
2018-02-17  1:13                     ` Mehdi Saada
2018-02-13  0:01 ` Mehdi Saada
2018-02-13  0:42   ` Mehdi Saada
2018-02-13  1:32     ` Mehdi Saada
2018-02-13  4:16       ` Bojan Bozovic
2018-02-13 11:28       ` Simon Wright
2018-02-13 12:03         ` Mehdi Saada
2018-02-13 13:25         ` Dmitry A. Kazakov
2018-02-19 18:10 ` Mehdi Saada
2018-02-19 18:16   ` Simon Clubley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox