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.
next prev 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