comp.lang.ada
 help / color / mirror / Atom feed
From: Lucretia <laguest9000@googlemail.com>
Subject: Re: Why .ads as well as .adb?
Date: Mon, 3 Jun 2019 11:51:31 -0700 (PDT)
Date: 2019-06-03T11:51:31-07:00	[thread overview]
Message-ID: <45206e16-8d5f-49fe-9978-b532eb5c1723@googlegroups.com> (raw)
In-Reply-To: <12ffe476-35a7-4442-994e-9a03972619bc@googlegroups.com>

On Monday, 3 June 2019 14:37:46 UTC+1, John Perry  wrote:

> So I was surprised that some people made absolute negations of the possibility along these lines:
> 
>     "You can't generate specification from implementation."

I knew Wirth had done this already, but he missed the point.
 
> I especially wonder this since one of them had just referred to gnatchop, whose online documentation provides an example that does precisely that [1]. So, when I read statements like the ones above, I wonder (a) if people understand that I don't mean Ada-as-is, but a hypothetically modified Ada (I am not proposing such a modification Ada; again, it's just curiosity); and (b) if I misunderstand what people mean by "specification".

In Ada, I've written code which is organised like this:

src/blah.ads
src/blah.adb
src/linux/blah-separate.adb
src/windows/blah-separate.adb
src/meh.ads
src/linux/meh.adb
src/windows/meh.adb
etc.

blah.ads is the interface to that package, it is what every OS sees, one interface, that's it. blah.adb is the body where it's portable. separate.adb contains a "separate" which is a subprogram which is separated from the blah.adb because it's platform specific. In the gpr file, I enable the OS specific directories. The meh package is similar except it has a whole body which is platform specific and therefore separated into the OS specific directory.

You can, if you want, create constants for the OS as well somewhere, i.e.

Inside src/oses.ads:

package OSes
   type OS is (Linux, Windows, etc.);
end OSes;

Inside src/linux/platforms.ads:

-- Similar for Windows.

with OSes;

package Platforms
   OS : constant OSes.OS := Linux;
end Platforms;

Then inside actual code:

with Platforms;

...

case Platforms.OS is
   when Platforms.Linux =>
      -- Linux code.
   when others =>
      -- Should be stripped from the final binary.
end case;

This method gives you compile time code stripping due to a static type system and the constant OS, platform specific code in a directory and using stubs in platform specific directories. It's very powerful and a shitload less messy than C and C++ methods of makefiles and preprocessor.

Luke.

  parent reply	other threads:[~2019-06-03 18:51 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-02  0:48 Why .ads as well as .adb? John Perry
2019-06-02  5:42 ` J-P. Rosen
2019-06-02  6:39 ` Dmitry A. Kazakov
2019-06-03  7:35   ` Maciej Sobczak
2019-06-03  7:57     ` J-P. Rosen
2019-06-03 19:49       ` Keith Thompson
2019-06-04  8:03       ` Maciej Sobczak
2019-06-03  8:13     ` Dmitry A. Kazakov
2019-06-03 19:51       ` Keith Thompson
2019-06-03 20:18         ` Dmitry A. Kazakov
2019-06-04  8:24       ` Maciej Sobczak
2019-06-04  9:33         ` Dmitry A. Kazakov
2019-06-05  9:04           ` Maciej Sobczak
2019-06-05 12:48             ` Dmitry A. Kazakov
2019-06-05 17:12               ` G. B.
2019-06-05 18:50                 ` Optikos
2019-06-05 22:57                   ` Randy Brukardt
2019-06-04 22:28         ` Randy Brukardt
2019-06-05  8:28           ` Maciej Sobczak
2019-06-05  9:20             ` J-P. Rosen
2019-06-05  9:28               ` Paul Rubin
2019-06-05 10:11                 ` Niklas Holsti
2019-06-05 12:58                   ` Maciej Sobczak
2019-06-05 14:28                     ` Niklas Holsti
2019-06-06  7:34                       ` Maciej Sobczak
2019-06-06 19:51                         ` Keith Thompson
2019-06-06 20:27                           ` J-P. Rosen
2019-06-06 21:12                         ` Randy Brukardt
2019-06-06 21:17                         ` Randy Brukardt
2019-06-06 22:08                           ` Dennis Lee Bieber
2019-06-07  7:59                           ` Maciej Sobczak
2019-06-07 10:42                             ` alby.gamper
2019-06-07 16:59                               ` Dennis Lee Bieber
2019-06-07 14:10                             ` Brad Moore
2019-06-07 23:37                               ` Paul Rubin
2019-06-08  1:16                                 ` Brad Moore
2019-06-08  7:34                                   ` Simon Wright
2019-06-08 17:44                                 ` G.B.
2019-06-08 21:41                                 ` Keith Thompson
2019-06-09  0:40                                   ` Paul Rubin
2019-06-09 18:56                                     ` Keith Thompson
2019-06-09 20:35                                       ` John Perry
2019-06-09 21:15                                         ` Niklas Holsti
2019-06-09 22:37                                           ` John Perry
2019-06-10  9:01                                             ` Simon Wright
2019-06-10 13:15                                               ` Simon Wright
2019-06-10  9:22                                             ` Niklas Holsti
2019-06-09 21:37                                         ` Simon Wright
2019-06-09 22:40                                           ` John Perry
2019-06-10  9:07                                             ` Simon Wright
2019-06-09 21:46                                         ` Niklas Holsti
2019-06-10 17:11                                         ` Dennis Lee Bieber
2019-06-08  4:57                             ` Randy Brukardt
2019-06-08 23:57                               ` Optikos
2019-06-09  0:43                                 ` Paul Rubin
2019-06-10  8:17                               ` Maciej Sobczak
2019-06-10 19:10                                 ` G.B.
2019-06-10 22:07                                 ` Randy Brukardt
2019-06-11  0:32                                   ` Optikos
2019-06-11 15:39                                     ` Brad Moore
2019-06-11 16:14                                       ` John Perry
2019-06-11 16:46                                         ` Shark8
2019-06-11 19:29                                           ` John Perry
2019-06-14  6:12                                             ` Brad Moore
2019-06-14 21:51                                               ` John Perry
2019-06-14 16:29                                             ` djakoogler
2019-06-11 18:19                                         ` joakimds
2019-06-11 15:49                                   ` Jeffrey R. Carter
2019-06-07  7:36                       ` Niklas Holsti
2019-06-05 22:41                     ` Randy Brukardt
2019-06-06  3:34             ` Keith Thompson
2019-06-06  7:29               ` Maciej Sobczak
2019-06-06 15:30                 ` John Perry
2019-06-06 15:41                 ` Brad Moore
2019-06-06 19:42                 ` Keith Thompson
2019-06-06 16:37               ` Dennis Lee Bieber
2019-06-02  9:59 ` joakimds
2019-06-02 20:14 ` G.B.
2019-06-03 13:37 ` John Perry
2019-06-03 14:50   ` Niklas Holsti
2019-06-03 19:23     ` John Perry
2019-06-03 21:04       ` Niklas Holsti
2019-06-03 18:51   ` Lucretia [this message]
2019-06-03 19:32     ` John Perry
2019-06-03 17:00 ` Jeffrey R. Carter
2019-06-03 18:59   ` Lucretia
2019-06-03 19:29   ` John Perry
2019-06-03 20:00     ` Jeffrey R. Carter
replies disabled

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