comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Access type to member procedure of instance (Object Oriented programming in Ada)
Date: Mon, 19 Nov 2012 17:59:06 -0600
Date: 2012-11-19T17:59:06-06:00	[thread overview]
Message-ID: <k8eh4g$bs8$1@munin.nbi.dk> (raw)
In-Reply-To: 9b0bcb37-8ae3-440f-af4f-a796702e4250@googlegroups.com

<ake.ragnar.dahlgren@gmail.com> wrote in message 
news:9b0bcb37-8ae3-440f-af4f-a796702e4250@googlegroups.com...
>Not sure if this has already been discussed but: Is it possible to define a 
>pointer to
> a member procedure of an instance?
>
>This problem has it's origin in the implementation of the MVC pattern for a 
>GtkAda application.
>Consider the following:
>
>package Some_Package is
>
>   type Message_Type is tagged null record;
>
>   procedure Print(Message : Message_Type);
>
>end Some_Package;
>
>package body Some_Package is
>
>   procedure Print (Message : Message_Type) is
>   begin
>      null;
>   end Print;
>
>end Some_Package;
>
>Then it is possible to create the following Main application that compiles 
>just fine:
>
>with Some_Package;
>procedure Main is
>   Message : Some_Package.Message_Type;
>begin
>   Message.Print;
>end Main;
>
>Is it possible to create a parameterless access type to the Message.Print 
>procedure?
>The following application refuses to compile:
>
>with Some_Package;
>procedure Main is
>   Message : Some_Package.Message_Type;
>
>   Method_Ref : access procedure := Message.Print'Access;
>begin
>   Method_Ref;
>end Main;
>
>The error message is: no selector "Print" for type "Message_Type" defined 
>at some_package.ads:3

I think this should work; if it doesn't, the error has something to do with 
conventions. So there is probably a compiler bug here.

The "name" (Ada synax terminology) "Message.Print" represents a 
parameterless procedure, and can be used in the same way as other 
parameterless procedures. In particular, it can be renamed as a 
parameterless procedure:

    procedure P renames Message.Print;

I'm not certain what the convention of this procedure is (it might be 
defined to be "intrinsic" somewhere, in which case you couldn't take 'Access 
to it, I can't find such a rule on a quick check of the RM). But it surely 
exists and should not report that "selector "Print" doesn't exist.

In any case, our intent is that one could use this just like any other 
procedure with the same profile. You can rename it, pass it as a formal 
subprogram, call it of course, etc. So I would expect 'Access to work as 
well, unless the RM explicitly says it does not.

                                                 Randy.

P.S. I don't know what everyone else is talking about here; it's *obvious* 
;-) that this should work in Ada and all other programming languages with 
similar constructs. (Please make careful note of the smiley here.)






  parent reply	other threads:[~2012-11-27 11:38 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-19  9:59 Access type to member procedure of instance (Object Oriented programming in Ada) ake.ragnar.dahlgren
2012-11-19 11:13 ` Georg Bauhaus
2012-11-19 11:39 ` Brian Drummond
2012-11-20 11:43   ` Brian Drummond
2012-11-20 21:57     ` Randy Brukardt
2012-11-19 13:03 ` sbelmont700
2012-11-19 16:18 ` Adam Beneschan
2012-11-19 17:02   ` Peter C. Chapin
2012-11-19 18:23     ` Adam Beneschan
2012-11-19 20:57       ` Peter C. Chapin
2012-11-19 21:26       ` Dmitry A. Kazakov
2012-11-19 22:19         ` Adam Beneschan
2012-11-20 10:12           ` Dmitry A. Kazakov
2012-11-20 21:51             ` Randy Brukardt
2012-11-21  8:24               ` Dmitry A. Kazakov
2012-11-21 22:19                 ` Randy Brukardt
2012-11-20 10:59     ` Brian Drummond
2012-11-19 20:22 ` ake.ragnar.dahlgren
2012-11-20 11:16   ` Brian Drummond
2012-11-19 20:52 ` ake.ragnar.dahlgren
2012-11-19 21:56   ` Dmitry A. Kazakov
2012-11-22  9:49     ` ake.ragnar.dahlgren
2012-11-19 22:13   ` sbelmont700
2012-11-19 23:59 ` Randy Brukardt [this message]
2012-11-20  0:05   ` Randy Brukardt
2012-11-20  1:00     ` Adam Beneschan
2012-11-20 21:38       ` Randy Brukardt
2012-11-20 23:43         ` Adam Beneschan
2012-11-21 22:12           ` Randy Brukardt
2012-11-22  1:59             ` Adam Beneschan
2012-11-29  2:43               ` Randy Brukardt
2012-11-20  0:52   ` Adam Beneschan
2012-11-20 21:34     ` Randy Brukardt
2012-11-20 11:28   ` Brian Drummond
2012-11-20 14:27     ` Georg Bauhaus
2012-11-20 15:52     ` Adam Beneschan
2012-11-22  9:47 ` ake.ragnar.dahlgren
2012-11-22 10:25   ` Dmitry A. Kazakov
2012-12-02 20:42     ` ake.ragnar.dahlgren
2012-12-03 11:21       ` Dmitry A. Kazakov
2012-12-03 20:21         ` ake.ragnar.dahlgren
2012-12-03 22:15           ` Dmitry A. Kazakov
2012-12-25 21:51           ` Gustaf Thorslund
2012-12-26 18:11             ` ake.ragnar.dahlgren
2012-11-22 12:13   ` Brian Drummond
2012-12-03 16:17     ` ake.ragnar.dahlgren
2012-12-03 21:56       ` Brian Drummond
replies disabled

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