* Using interfaces
@ 2018-06-02 15:20 gautier_niouzes
2018-06-02 15:55 ` Jere
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: gautier_niouzes @ 2018-06-02 15:20 UTC (permalink / raw)
Hello,
I am developing a package for displaying some kinds of figures on an open set of devices. I'm trying to use interfaces for that.
with System;
package Test_interfaces is
type Real is digits System.Max_Digits;
type Box is record left, bottom, width, height : Real; end record;
type Graphic_Figures is abstract tagged record bounding : Box; end record;
procedure Set_Bounding_Box (figure: Graphic_Figures);
-- This draws any kind of figure
procedure Draw (figure: Graphic_Figures; parameter: Integer) is abstract;
type Any_Device is interface;
-- Callback method for filling a rectangle
procedure Filled_Rectangle (device: Any_Device) is abstract;
type Device_X is new Any_Device with null record;
procedure Filled_Rectangle (device: Device_X);
type Figure_A is new Graphic_Figures with null record;
procedure Draw (figure: Figure_A; parameter: Integer);
type Figure_A_on_Device_X is new Figure_A and Device_X with null record;
end Test_interfaces;
Now on Figure_A_on_Device_X GNAT tells me rightfully that Device_X must be an interface. Now if I have instead:
type Figure_A_on_Device_X is new Figure_A and Any_Device with null record;
procedure Filled_Rectangle (device: Figure_A_on_Device_X);
or in two steps,
type Figure_A_on_Any_Device is abstract new Figure_A and Any_Device with null record;
type Figure_A_on_Device_X is new Figure_A_on_Any_Device with null record;
procedure Filled_Rectangle (device: Figure_A_on_Device_X);
this is okay but I would need to copy-paste the same implementation code of Filled_Rectangle for device X in the case of Figure_B and so on. Not nice!
How do I get something like Figure_A_on_Device_X ?
Am I expecting too much from interfaces?
TIA
Gautier
_____________________________________________________________
A free online game in Ada: http://pasta.phyrama.com/game.html
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-02 15:20 Using interfaces gautier_niouzes
@ 2018-06-02 15:55 ` Jere
2018-06-02 17:00 ` Dmitry A. Kazakov
` (2 subsequent siblings)
3 siblings, 0 replies; 9+ messages in thread
From: Jere @ 2018-06-02 15:55 UTC (permalink / raw)
On Saturday, June 2, 2018 at 11:20:53 AM UTC-4, gautier...@hotmail.com wrote:
> Hello,
> I am developing a package for displaying some kinds of figures on an open set of devices. I'm trying to use interfaces for that.
>
> SNIPPED...
>
> this is okay but I would need to copy-paste the same implementation code of Filled_Rectangle for device X in the case of Figure_B and so on. Not nice!
>
> How do I get something like Figure_A_on_Device_X ?
> Am I expecting too much from interfaces?
>
I generally do something similar to what you do in Rust:
type Figure_A_on_Device_X is new Figure_A and Any_Device with record
Device_Impl : Device_X;
end record;
procedure Filled_Rectangle (device: Figure_A_on_Device_X);
and then
procedure Filled_Rectangle (device: Figure_A_on_Device_X) is
begin
device.Device_Impl.Filled_Rectangle;
end Filled_Rectangle;
You can also make Figure_A_on_Device_X a private type to hide that.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-02 15:20 Using interfaces gautier_niouzes
2018-06-02 15:55 ` Jere
@ 2018-06-02 17:00 ` Dmitry A. Kazakov
2018-06-02 17:22 ` Jeffrey R. Carter
2018-06-04 9:32 ` gautier_niouzes
3 siblings, 0 replies; 9+ messages in thread
From: Dmitry A. Kazakov @ 2018-06-02 17:00 UTC (permalink / raw)
On 2018-06-02 17:20, gautier_niouzes@hotmail.com wrote:
> I am developing a package for displaying some kinds of figures on an open set of devices. I'm trying to use interfaces for that.
This is full multiple dispatch [*]:
procedure Draw
( Shape : Figure;
Surface : in out Device
) is abstract; -- This is not Ada!
Interfaces is no [direct] help.
Usually multiple dispatch is replaced with cascaded dispatch. You first
dispatch on the figure and then on the device from the implementation of
Draw:
type Device is limited interface;
-- Drawing primitives
procedure Draw_Filled_Rectangle
( Surface : in out Device;
Box : Rectangle;
Color : RGBA_Color
) is abstract;
...
type Figure is interface;
procedure Draw
( Shape : Figure;
Surface : in out Device'Class -- No dispatch
) is abstract;
type Filled_Rectangle is new Figure with record
Position : Box;
Color : RGBA_Color;
end record;
overriding
procedure Draw
( Shape : Filled_Rectangle;
Surface : in out Device'Class
);
procedure Draw
( Shape : Filled_Rectangle;
Surface : in out Device'Class
) is
begin
Surface.Draw_Filled_Rectangle (Shape.Position, Shape.Color);
end Draw;
This is too simple to work always in practice. There is no replacement
for multiple dispatch.
-------------------------------
* A simplified form of multiple dispatch is multi-method when only one
types hierarchy is involved, like in arithmetic operations. Full
multiple dispatch is when different type hierarchies share operations
like Figure and Device share Draw.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-02 15:20 Using interfaces gautier_niouzes
2018-06-02 15:55 ` Jere
2018-06-02 17:00 ` Dmitry A. Kazakov
@ 2018-06-02 17:22 ` Jeffrey R. Carter
2018-06-02 18:43 ` Dan'l Miller
2018-06-04 9:32 ` gautier_niouzes
3 siblings, 1 reply; 9+ messages in thread
From: Jeffrey R. Carter @ 2018-06-02 17:22 UTC (permalink / raw)
On 06/02/2018 05:20 PM, gautier_niouzes@hotmail.com wrote:
> Hello,
> I am developing a package for displaying some kinds of figures on an open set of devices. I'm trying to use interfaces for that.
"IMHO, Interfaces are worthless."
Randy Brukardt
He usually knows what he's talking about.
--
Jeff Carter
"C++ is like giving an AK-47 to a monk, shooting him
full of crack and letting him loose in a mall and
expecting him to balance your checking account
'when he has the time.'"
Drew Olbrich
52
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-02 17:22 ` Jeffrey R. Carter
@ 2018-06-02 18:43 ` Dan'l Miller
2018-06-03 2:11 ` Shark8
0 siblings, 1 reply; 9+ messages in thread
From: Dan'l Miller @ 2018-06-02 18:43 UTC (permalink / raw)
On Saturday, June 2, 2018 at 12:22:09 PM UTC-5, Jeffrey R. Carter wrote:
> On 06/02/2018 05:20 PM, Gautier Niouzes wrote:
> > Hello,
> > I am developing a package for displaying some kinds of figures on an open set of devices. I'm trying to
> > use interfaces for that.
If you are yearning for multiple dispatch, then it could conceivably be achieved in modern Ada the way that single-dispatch OO was described for Ada83:
http://home.pipeline.com/~hbaker1/OOAdaLetters.html
Or you could hack multimethods into a forked GNAT. The primary annoyance is how best to achieve a multidimensional look-up based on a coordinate of 2 or more tags, e.g., in O(1) time and O(mnᵏ) space(-per-executable/DLL) would be the multidimensional-array implementation (instead of today's single-dimensional tag-based array), where m is the quantity of tagged records, n is the quantity of densely-type-dispatched multimethods per tagged record, and k is the degree of mult- in multimethods/multiple-dispatch. k=2 is called double dispatch. k=3 is called triple dispatch. and so forth
A secondary annoyance is erroring out at compile-time if the program has any sparseness whatsoever in that multidimensional array (i.e., forgot to declare a multimethod for some combination of 'Classes).
> "IMHO, Interfaces are worthless."
> Randy Brukardt
>
> He usually knows what he's talking about.
Ummmmm. I suspect that Randy's statement neither started nor ended there. Instead of being in ‘a pox on all their houses’ and ‘the horse they rode in on’ mode, I suspect that Randy in the very next sentence or paragraph said that language-construct X instead better accomplishes what ‘interface’-keyword constructs seek to do.
For example, in many modern programming languages, Ada included, there is a natural tension between the OO feature-set and the generic/parameterized-types feature-set as 2 nearly duplicated ways of accomplishing analogous goals. Of course this is because runtime/tagged-record polymorphism and parametric/generic polymorphism are 2 forms of polymorphism at different vertexes on the lambda cube.
https://en.wikipedia.org/wiki/Lambda_cube
> "C++ is like giving an AK-47 to a monk, shooting him
> full of crack and letting him loose in a mall and
> expecting him to balance your checking account
> 'when he has the time.'"
I would say that modern C++ is like giving the template engine Turing completeness with a syntax that is only slightly more readable than a Turing-machine's infinite-length tape and then making the entire reason for the language to exist to constantly put bandages on the never-quite-healing wounds inflicted by the Turing-completeness-in-the-template-engine bull goring the rest of the C++ language with its horns, as if the rest of the language is a porcelain shop that stocks only red items. Oh wait. No “like” about it; that is what really happened.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-02 18:43 ` Dan'l Miller
@ 2018-06-03 2:11 ` Shark8
2018-06-03 3:06 ` Dan'l Miller
2018-06-03 7:06 ` Dmitry A. Kazakov
0 siblings, 2 replies; 9+ messages in thread
From: Shark8 @ 2018-06-03 2:11 UTC (permalink / raw)
On Saturday, June 2, 2018 at 12:43:34 PM UTC-6, Dan'l Miller wrote:
>
> For example, in many modern programming languages, Ada included, there is a natural tension between the OO feature-set and the generic/parameterized-types feature-set as 2 nearly duplicated ways of accomplishing analogous goals.
No.
OOP and Generics are orthogonal in their goals: https://www.youtube.com/watch?v=9lv2lBq6x4A
The "tension" is due to a fundamental misunderstanding of what OOP *is*, which I think is due to the whole OOP-craze in academia, to the point where other ideas were forgotten/discarded: https://www.youtube.com/watch?v=8pTEmbeENF4&nohtml5=1
> I would say that modern C++ is like giving the template engine Turing completeness with a syntax that is only slightly more readable than a Turing-machine's infinite-length tape and then making the entire reason for the language to exist to constantly put bandages on the never-quite-healing wounds inflicted by the Turing-completeness-in-the-template-engine bull goring the rest of the C++ language with its horns, as if the rest of the language is a porcelain shop that stocks only red items. Oh wait. No “like” about it; that is what really happened.
The amount of time/energy spent "fixing C" (and C++) is truly astounding.
I wonder how well-off Ada would be if even 1/10th of that energy had been put into addressing Ada's weaknesses, like (eg) few libraries, not as many tools, etc.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-03 2:11 ` Shark8
@ 2018-06-03 3:06 ` Dan'l Miller
2018-06-03 7:06 ` Dmitry A. Kazakov
1 sibling, 0 replies; 9+ messages in thread
From: Dan'l Miller @ 2018-06-03 3:06 UTC (permalink / raw)
On Saturday, June 2, 2018 at 9:11:50 PM UTC-5, Shark8 wrote:
> On Saturday, June 2, 2018 at 12:43:34 PM UTC-6, Dan'l Miller wrote:
> >
> > For example, in many modern programming languages, Ada included, there is a natural tension between the OO feature-set and the generic/parameterized-types feature-set as 2 nearly duplicated ways of accomplishing analogous goals.
>
> No.
> OOP and Generics are orthogonal in their goals: https://www.youtube.com/watch?v=9lv2lBq6x4A
Orthogonal. Hence the lambda cube's 90° angles in the corners. ;-P
https://en.wikipedia.org/wiki/Lambda_cube
the orthogonal axes in the coordinate system
run-time •polymorphism•: values depending on types
λ2
compile-time •polymorphism• (a.k.a. parametric •polymorphism•) in generics: types depending on types
λω_
multistage programming (source-code generators): types depending on values
λΠ
permitting the pairwise and threesome combination thereof for a semantic vector system of expressivity in next-gen programming languages
> The amount of time/energy spent "fixing C" (and C++) is truly astounding.
> I wonder how well-off Ada would be if even 1/10th of that energy had been put into addressing Ada's
> weaknesses, like (eg) few libraries, not as many tools, etc.
It is truly is sad.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-03 2:11 ` Shark8
2018-06-03 3:06 ` Dan'l Miller
@ 2018-06-03 7:06 ` Dmitry A. Kazakov
1 sibling, 0 replies; 9+ messages in thread
From: Dmitry A. Kazakov @ 2018-06-03 7:06 UTC (permalink / raw)
On 2018-06-03 04:11, Shark8 wrote:
> On Saturday, June 2, 2018 at 12:43:34 PM UTC-6, Dan'l Miller wrote:
>>
>> For example, in many modern programming languages, Ada included, there is a natural tension between the OO feature-set and the generic/parameterized-types feature-set as 2 nearly duplicated ways of accomplishing analogous goals.
>
> No.
Yes. Both are forms of polymorphism with the same goal of supporting
generic programming = programming in terms of sets of types.
> OOP and Generics are orthogonal in their goals: https://www.youtube.com/watch?v=9lv2lBq6x4A
They are orthogonal only in terms of implementation, so that they can be
mixed and used independently.
[ Macros are automatically a meta-language and thus orthogonal to
anything in the language. ]
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Using interfaces
2018-06-02 15:20 Using interfaces gautier_niouzes
` (2 preceding siblings ...)
2018-06-02 17:22 ` Jeffrey R. Carter
@ 2018-06-04 9:32 ` gautier_niouzes
3 siblings, 0 replies; 9+ messages in thread
From: gautier_niouzes @ 2018-06-04 9:32 UTC (permalink / raw)
Thanks for all those interesting answers!
Finally I've abstracted only the output device and things stay quite simple.
(for a glimpse: https://sourceforge.net/projects/ada-bar-codes/ :-) )
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2018-06-04 9:32 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-02 15:20 Using interfaces gautier_niouzes
2018-06-02 15:55 ` Jere
2018-06-02 17:00 ` Dmitry A. Kazakov
2018-06-02 17:22 ` Jeffrey R. Carter
2018-06-02 18:43 ` Dan'l Miller
2018-06-03 2:11 ` Shark8
2018-06-03 3:06 ` Dan'l Miller
2018-06-03 7:06 ` Dmitry A. Kazakov
2018-06-04 9:32 ` gautier_niouzes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox