From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: What would you like in Ada202X?
Date: Sun, 06 May 2012 21:48:00 +0300
Date: 2012-05-06T21:48:00+03:00 [thread overview]
Message-ID: <a0nvb0Fem2U1@mid.individual.net> (raw)
In-Reply-To: <3637793.35.1335340026327.JavaMail.geo-discussion-forums@ynfi5>
On 12-04-25 10:47 , Martin wrote:
> Ok, we don't officially have Ada2012 yet but as no new features are
> going to be added to it, now seems like a good time to start thinking
> about the next revision.
There is a proposal for extensible enumerated types, AI95-261
(http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00261.txt), that was
rejected (and I don't much like it, either). While reading John Barnes'
second part of "Rationale for Ada 2012" in Ada User Journal, for some
reason an idea came to me of a different and perhaps better concept of
extension for enumerated types. I'm not sure that this would be a
worth-while addition to Ada, but here it is, for your pleasure or
displeasure, as briefly as I could write it.
The new concept can be describes as "extending enumerated types by
deepening", where the AI95-261 concept is "extending by widening".
The terms "deepening" and "widening" come from seeing an enumerated type
as a classification of some set of things. For example, the messages
exhanged in some protocol could be classified in this way, initially and
roughly:
type Message_Kind1 is (Sign_On, Request, Reply, Sign_Off);
and some general operations might be written using only this rough
classification. AI95-261 proposed the ability to derive a "wider" type
with more literals, as in:
type Wider_Message_Kind1 is new Message_Kind1 with (Tick, Ping);
The main problem with this extension by widening is that the derived
type, Wider_Message_Kind1, is not a "subclass" of the parent type,
because some values of the derived type (the new literals) cannot be
converted to (or viewed as) values of the parent type. The derived type
can't inherit operations from the parent type, because those operations
can't handle the added values. AI95-261 suggests to raise
Constraint_Error in such cases. Note how this differs from derived
tagged types.
In "extension by deepening", the classification is not widened by adding
more literals "at the end", but is deepened, or refined, by dividing
some or all of the parent literals into a set of new literals, to give a
more detailed classification.
In the protocol example, we can distinguish different kinds of Request:
a read request or a write request, and different kinds of Reply: some
data (in reply to a read request), an ack (in reply to a write request),
or a refusal (in reply to any invalid request). The derivation syntax
could be like this:
type Detailed_Message_Kind is new Message_Kind1 with (
Request => (Read, Write),
Reply => (Data, Ack, Refused),
others => <>);
The part "others => <>" is an abbreviation for "Sign_On => (Sign_On),
Sign_Off => (Sign_Off)" and means that the literals Sign_On and Sign_Off
are not refined in this derivation.
The derived enumerated type Detailed_Message_Kind has the following
properties:
- Its literals are, in order: Sign_On, Read, Write, Data, Ack, Refused,
Sign_Off. Note that the Message_Kind1 literals Request and Reply are not
included, because they are refined into several new literals.
- It inherits all primitive operations of Message_Kind1, except those
with "out" or "in out" parameters of type Message_Kind1, and except
functions that return Message_Kind1. (See below for alternative rules.)
- Its values can be converted to type Message_Kind1 (including implicit
conversion as an "in" parameter to an inherited operation) as follows:
Sign_On to Sign_On
Read to Request
Write to Request
Data to Reply
Ack to Reply
Refused to Reply
Sign_Off to Sign_Off
- At least conceptually, a Detailed_Message_Kind value is represented by
some "parent" bits that represent a Message_Kind1 value (default
encodings 0 .. 3), plus some "extension" bits that are different for
Read and Write (0 and 1), and different for Data, Ack, and Refused (0,
1, and 2). For the Message_Kind1 literals that are not refined (Sign_On
and Sign_Off) the extension bits are logically irrelevant but in
practice would have a fixed value (zero seems natural).
- Conversion from Detailed_Message_Kind to Message_Kind1 keeps the
parent bits and discards the extension bits.
- Conversion from Message_Kind1 to Detailed_Message_Kind is not allowed,
because where would we get the values for the extension bits? This is
why Detailed_Message_Kind does not inherit Message_Kind1 operations that
produce values of type Message_Kind1. (An alternative design could
define default values for the extension bits, for example that a Request
is by default converted to a Read, but this seems a bit arbitrary. A
further alternative is to allow conversion for literals that are not
refined -- in the example, Sign_On and Sign_Off -- and raise
Constraint_Error otherwise.)
This kind of enumeration extension has some nice features:
- It provides a way to describe hierarchical classifications in a
value-based way, without involving references to tagged objects in a
class hierarchy.
- The values that describe the classification are discrete scalars,
which can be used as discriminants and to index arrays and case statements.
- The derived type inherits many operations of the parent type, and the
derived type can substitute for the parent type (LSP).
Extension by deepening can also implement a form of "extension by
widening", as follows: The parent type is provided with an extra literal
to provide the "root" of any new literals to be added in derived types.
For example, here we use the literal "More" for this:
type Message_Kind2 is (Sign_On, Request, Reply, Sign_Off, More);
To "widen" the type by adding message-kinds Tick and Ping, the More
literal is refined:
type Wider_Message_Kind is new Message_Kind2 with (
More => (Tick, Ping, More),
others => <>);
Note that we added also a new literal More, so that Wider_Message_Kind
can be widened further. Wider_Message_Kind has the literals Sign_On,
Request, Reply, Sign_Off, Tick, Ping, More. A conversion from
Wider_Message_Kind to Message_Kind2 maps the literals Tick, Ping, and
(the new) More to Message_Kind2'(More). Thus, the new literals are all
seen as Message_Kind2'(More) within the operations that
Wider_Message_Kind inherits from Message_Kind2.
As an option, some standard word or symbol could be standardized to
serve the role of our "More" literal, above. For example, the reserved
word "new" could be used for this. We could then come all the way back
to AI95-261 as follows: if the parent type does not list "new" as a
literal, but a derived type is derived by refining "new", then
conversion from the derived type to the parent type is allowed only for
the non-refined literals and raises Constraint_Error for the added
literals. For example:
type Wider_Message_Kind2 is new Message_Kind1 with
new => (Tick, Ping, new);
(Here I have used an abbreviated syntax, unambiguous in this case,
without the outermost parentheses and with an assumed "others => <>".)
Continuing to the next derivation level:
type Widest_Message_Kind is new Wider_Message_Kind2 with
new => (Greeting, Abort_Last_Request);
Now:
- Any value of Widest_Message_Kind can be converted to
Wider_Message_Kind2. The literals Greeting and Abort_Last_Request are
converted to Wider_Message_Kind2'(new).
- An attempt to convert the Wider_Message_Kind2 values Tick, Ping, or
Wider_Message_Kind2'(new) to Message_Kind1 raises Constraint_Error
(because Message_Kind1 does not list the "new" literal).
So, there it is. There is much that I haven't thought out, for example
how representation clauses would work. But the main question is: would
this feature be useful? Would it be too redundant with tagged types?
What do you think?
--
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
. @ .
next prev parent reply other threads:[~2012-05-06 18:48 UTC|newest]
Thread overview: 312+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-25 7:47 What would you like in Ada202X? Martin
2012-04-25 8:01 ` Yannick Duchêne (Hibou57)
2012-04-25 8:30 ` stefan-lucks
2012-04-25 19:21 ` Adam Beneschan
2012-04-28 11:50 ` Yannick Duchêne (Hibou57)
2012-04-28 13:21 ` Yannick Duchêne (Hibou57)
2012-04-29 1:03 ` BrianG
2012-04-25 8:36 ` Jacob Sparre Andersen
2012-04-25 8:46 ` Yannick Duchêne (Hibou57)
2012-04-25 9:04 ` leonid
2012-04-25 11:30 ` Jacob Sparre Andersen
2012-04-26 2:00 ` Randy Brukardt
2012-04-26 13:10 ` AdaMagica
2012-04-26 15:49 ` anon
2012-04-27 0:26 ` Randy Brukardt
2012-04-25 9:10 ` Martin
2012-04-25 8:36 ` Dmitry A. Kazakov
2012-04-25 8:59 ` Yannick Duchêne (Hibou57)
2012-04-25 9:24 ` Dmitry A. Kazakov
2012-04-25 10:05 ` Yannick Duchêne (Hibou57)
2012-04-26 2:08 ` Randy Brukardt
2012-04-26 8:50 ` Dmitry A. Kazakov
2012-04-26 23:50 ` Randy Brukardt
2012-04-27 5:03 ` Yannick Duchêne (Hibou57)
2012-04-27 13:50 ` Robert A Duff
2012-04-27 23:25 ` Randy Brukardt
2012-04-28 6:32 ` Yannick Duchêne (Hibou57)
2012-04-27 7:56 ` Dmitry A. Kazakov
2012-04-27 13:56 ` Robert A Duff
2012-04-28 8:32 ` Dmitry A. Kazakov
2012-04-28 11:44 ` Yannick Duchêne (Hibou57)
2012-04-29 13:35 ` Robert A Duff
2012-04-29 15:59 ` Dmitry A. Kazakov
2012-04-29 19:27 ` Robert A Duff
2012-04-29 20:09 ` Dmitry A. Kazakov
2012-05-01 2:17 ` Randy Brukardt
2012-04-25 9:31 ` Dmitry A. Kazakov
2012-04-26 2:10 ` Randy Brukardt
2012-05-10 7:29 ` Gustaf Thorslund
2012-05-14 9:25 ` stefan-lucks
2012-05-14 12:19 ` Dmitry A. Kazakov
2012-05-14 13:09 ` Georg Bauhaus
2012-05-14 13:40 ` Dmitry A. Kazakov
2012-05-14 15:50 ` Georg Bauhaus
2012-05-14 20:24 ` Gustaf Thorslund
2012-05-14 22:49 ` tmoran
2012-05-15 6:15 ` Gustaf Thorslund
2012-04-25 9:09 ` Georg Bauhaus
2012-04-25 9:14 ` Yannick Duchêne (Hibou57)
2012-04-25 9:30 ` Dmitry A. Kazakov
2012-04-25 13:11 ` Marc C
2012-04-25 13:35 ` Georg Bauhaus
2012-04-25 13:36 ` Pascal Obry
2012-04-25 14:18 ` Yannick Duchêne (Hibou57)
2012-04-25 16:12 ` björn lundin
2012-04-25 17:36 ` Lucretia
2012-04-25 20:26 ` Yannick Duchêne (Hibou57)
2012-04-26 15:20 ` Simon Wright
2012-04-28 10:58 ` björn lundin
2012-04-26 12:37 ` Marc C
2012-04-25 18:14 ` Jeffrey Carter
2012-04-25 18:51 ` Dmitry A. Kazakov
2012-04-25 20:53 ` Yannick Duchêne (Hibou57)
2012-04-25 21:14 ` Jeffrey Carter
2012-04-25 21:27 ` Yannick Duchêne (Hibou57)
2012-04-25 21:30 ` Yannick Duchêne (Hibou57)
2012-04-25 22:33 ` Jeffrey Carter
2012-04-26 0:50 ` Yannick Duchêne (Hibou57)
2012-04-26 1:06 ` Jeffrey Carter
2012-04-28 11:02 ` okellogg
2012-04-28 11:48 ` Yannick Duchêne (Hibou57)
2012-04-29 13:43 ` Robert A Duff
2012-04-29 16:59 ` okellogg
2012-04-29 19:04 ` Robert A Duff
2012-04-29 19:32 ` Yannick Duchêne (Hibou57)
2012-04-29 19:37 ` Yannick Duchêne (Hibou57)
2012-04-29 19:55 ` Robert A Duff
2012-04-29 21:37 ` okellogg
2012-04-29 22:51 ` Robert A Duff
2012-04-26 2:23 ` Randy Brukardt
2012-04-26 8:25 ` Dmitry A. Kazakov
2012-04-26 23:58 ` Randy Brukardt
2012-04-27 7:23 ` Dmitry A. Kazakov
2012-04-27 22:42 ` Randy Brukardt
2012-04-28 7:53 ` Dmitry A. Kazakov
2012-04-28 11:40 ` Yannick Duchêne (Hibou57)
2012-04-28 11:51 ` Dmitry A. Kazakov
2012-05-01 2:32 ` Randy Brukardt
2012-04-27 7:41 ` Jacob Sparre Andersen
2012-04-27 15:33 ` Adam Beneschan
2012-04-29 7:57 ` J-P. Rosen
2012-04-29 17:32 ` Robert Love
2012-04-29 23:33 ` Shark8
2012-05-10 7:18 ` ytomino
2012-05-10 15:25 ` Adam Beneschan
2012-05-10 15:51 ` ytomino
2012-05-10 17:09 ` Adam Beneschan
2012-05-10 18:25 ` ytomino
2012-04-25 12:13 ` Georg Bauhaus
2012-04-25 16:41 ` tmoran
2012-04-25 13:10 ` Nicholas Paul Collin Gloucester
2012-04-25 18:10 ` Zhu Qun-Ying
2012-04-25 18:07 ` okellogg
2012-04-25 19:15 ` Adam Beneschan
2012-04-25 20:12 ` okellogg
2012-04-25 20:26 ` Jeffrey Carter
2012-04-25 21:09 ` Yannick Duchêne (Hibou57)
2012-04-25 21:11 ` Martin Dowie
2012-04-25 22:18 ` Georg Bauhaus
2012-04-26 2:36 ` Randy Brukardt
2012-04-25 20:40 ` Adam Beneschan
2012-04-25 22:05 ` okellogg
2012-04-25 23:13 ` Adam Beneschan
2012-04-26 1:46 ` Brad Moore
2012-04-26 2:41 ` Randy Brukardt
2012-04-26 7:43 ` Mart van de Wege
2012-04-26 8:46 ` Georg Bauhaus
2012-04-26 14:57 ` Mart van de Wege
2012-04-26 15:28 ` Adam Beneschan
2012-04-26 18:16 ` Jeffrey Carter
2012-04-26 21:41 ` Mart van de Wege
2012-04-26 22:01 ` Jeffrey Carter
2012-04-25 20:19 ` Jeffrey Carter
2012-04-25 21:05 ` Yannick Duchêne (Hibou57)
2012-04-26 2:33 ` Randy Brukardt
2012-04-25 18:24 ` Jeffrey Carter
2012-04-25 19:02 ` Dmitry A. Kazakov
2012-04-25 19:02 ` Oliver Kleinke
2012-04-25 19:27 ` Dmitry A. Kazakov
2012-04-25 20:50 ` Georg Bauhaus
2012-04-26 8:15 ` Oliver Kleinke
2012-04-26 9:16 ` Jacob Sparre Andersen
2012-04-26 9:16 ` Georg Bauhaus
2012-04-25 21:17 ` Yannick Duchêne (Hibou57)
2012-04-26 8:18 ` Oliver Kleinke
2012-04-25 22:14 ` ytomino
2012-04-26 0:37 ` Yannick Duchêne (Hibou57)
2012-04-26 2:52 ` Randy Brukardt
2012-04-26 15:19 ` Adam Beneschan
2012-04-26 15:55 ` Dmitry A. Kazakov
2012-04-27 2:38 ` ytomino
2012-04-27 8:09 ` Georg Bauhaus
2012-04-27 8:19 ` Dmitry A. Kazakov
2012-04-27 9:46 ` Georg Bauhaus
2012-04-27 10:05 ` Dmitry A. Kazakov
2012-04-27 11:04 ` Georg Bauhaus
2012-04-27 12:10 ` Dmitry A. Kazakov
2012-04-26 4:12 ` ytomino
2012-04-26 8:44 ` Dmitry A. Kazakov
2012-04-26 11:22 ` Yannick Duchêne (Hibou57)
2012-04-26 13:17 ` Dmitry A. Kazakov
2012-04-27 0:09 ` Randy Brukardt
2012-04-27 5:23 ` Yannick Duchêne (Hibou57)
2012-04-27 22:49 ` Randy Brukardt
2012-04-27 7:31 ` Dmitry A. Kazakov
2012-04-27 22:46 ` Randy Brukardt
2012-04-28 8:41 ` Dmitry A. Kazakov
2012-04-25 22:30 ` Shark8
2012-04-26 0:42 ` Yannick Duchêne (Hibou57)
2012-04-26 9:29 ` gautier_niouzes
2012-04-26 11:27 ` Yannick Duchêne (Hibou57)
2012-04-26 13:19 ` Dmitry A. Kazakov
2012-04-30 22:38 ` gautier_niouzes
2012-04-27 0:18 ` sbelmont700
2012-04-27 16:04 ` Shark8
2012-04-27 21:11 ` sbelmont700
2012-04-27 23:18 ` Randy Brukardt
2012-04-27 23:40 ` sbelmont700
2012-04-28 2:17 ` Adam Beneschan
2012-04-28 8:03 ` Dmitry A. Kazakov
2012-04-29 3:20 ` Shark8
2012-04-29 15:42 ` sbelmont700
2012-04-29 23:29 ` Shark8
2012-04-30 2:00 ` sbelmont700
2012-04-27 23:03 ` Randy Brukardt
2012-04-27 5:10 ` Nasser M. Abbasi
2012-04-27 5:36 ` Yannick Duchêne (Hibou57)
2012-04-27 10:59 ` Martin
2012-04-27 17:05 ` Simon Wright
2012-04-30 7:28 ` Martin
2012-05-01 2:45 ` Randy Brukardt
2012-05-01 7:28 ` Martin
2012-05-01 17:15 ` Shark8
2012-05-01 18:13 ` Jeffrey Carter
2012-05-01 19:30 ` Dmitry A. Kazakov
2012-05-01 20:23 ` Robert A Duff
2012-05-01 21:53 ` tmoran
2012-05-01 22:05 ` Adam Beneschan
[not found] ` <JYOdnei1xPFt8D3SnZ2dnUVZ_qudnZ2d@earthlink.com>
2012-05-02 4:28 ` Shark8
2012-05-02 8:18 ` Martin
2012-05-02 12:57 ` Shark8
2012-05-08 17:45 ` Martin Dowie
2012-05-03 15:30 ` gautier_niouzes
2012-05-03 15:58 ` Yannick Duchêne (Hibou57)
2012-05-04 7:25 ` Martin
2012-05-01 16:23 ` Simon Wright
2012-04-29 3:52 ` Shark8
2012-04-29 7:13 ` Dmitry A. Kazakov
2012-04-29 9:17 ` gautier_niouzes
2012-04-27 15:33 ` mjsilva
2012-04-28 1:38 ` BrianG
2012-05-01 15:04 ` mjsilva
2012-04-30 6:28 ` Michael Rohan
2012-04-30 6:40 ` Michael Rohan
2012-04-30 8:27 ` Yannick Duchêne (Hibou57)
2012-05-06 18:48 ` Niklas Holsti [this message]
2012-05-06 19:27 ` Simon Wright
2012-05-06 20:47 ` Niklas Holsti
2012-05-06 19:28 ` Dmitry A. Kazakov
2012-05-06 20:06 ` Yannick Duchêne (Hibou57)
2012-05-06 21:26 ` Niklas Holsti
2012-05-07 7:49 ` Dmitry A. Kazakov
2012-05-07 23:18 ` Niklas Holsti
2012-05-08 9:03 ` Dmitry A. Kazakov
2012-05-08 19:20 ` Niklas Holsti
2012-05-08 19:44 ` Niklas Holsti
2012-05-09 8:02 ` Dmitry A. Kazakov
2012-05-10 0:47 ` Randy Brukardt
2012-05-13 19:53 ` Niklas Holsti
2012-05-15 6:30 ` Randy Brukardt
2012-05-15 7:58 ` Dmitry A. Kazakov
2012-05-16 0:05 ` Randy Brukardt
2012-05-17 19:48 ` Niklas Holsti
2012-05-18 4:28 ` Randy Brukardt
2012-05-17 14:40 ` Niklas Holsti
2012-05-17 17:12 ` Dmitry A. Kazakov
2012-05-07 6:33 ` ytomino
2012-05-07 22:34 ` Niklas Holsti
2012-05-08 0:48 ` Randy Brukardt
2012-05-08 6:30 ` Niklas Holsti
2012-05-08 22:11 ` Randy Brukardt
2012-05-08 22:22 ` Randy Brukardt
2012-05-09 7:18 ` Dmitry A. Kazakov
2012-05-10 0:30 ` Randy Brukardt
2012-05-10 7:44 ` Dmitry A. Kazakov
2012-05-10 21:22 ` Niklas Holsti
2012-05-11 7:39 ` Dmitry A. Kazakov
2012-05-12 0:11 ` Randy Brukardt
2012-05-15 21:35 ` Niklas Holsti
2012-05-16 0:19 ` Randy Brukardt
2012-05-17 22:01 ` Niklas Holsti
2012-05-18 4:35 ` Randy Brukardt
2012-05-16 7:39 ` Dmitry A. Kazakov
2012-05-10 6:45 ` ytomino
2012-05-15 21:52 ` Niklas Holsti
2012-07-03 15:41 ` Pascal Obry
2012-07-03 15:50 ` Pascal Obry
2012-07-04 11:41 ` Ada novice
2012-07-04 12:30 ` Nasser M. Abbasi
2012-07-04 17:05 ` shai.lesh
2012-07-04 17:55 ` Simon Wright
2012-07-04 18:35 ` Nasser M. Abbasi
[not found] ` <0o59v7djiffnl7sqdpp2uiso78oa9hb8sb@invalid.netcom.com>
2012-07-04 20:34 ` shai.lesh
2012-07-04 22:26 ` Simon Wright
[not found] ` <j5p9v7l646mlk9m073u4m69dg3gjfjblfm@invalid.netcom.com>
2012-07-05 7:53 ` shai.lesh
2012-07-05 8:18 ` Simon Wright
2012-07-06 0:48 ` John B. Matthews
2012-07-05 8:30 ` georg bauhaus
2012-07-05 11:57 ` shai.lesh
2012-07-05 12:11 ` Nasser M. Abbasi
2012-07-05 12:21 ` Nasser M. Abbasi
2012-07-05 13:07 ` shai.lesh
2012-07-05 14:08 ` Nasser M. Abbasi
2012-07-05 15:51 ` Ada novice
2012-07-05 15:55 ` johnscpg
2012-07-05 16:57 ` Simon Wright
2012-07-05 17:36 ` shai.lesh
2012-07-06 12:07 ` Ada novice
2012-07-06 15:29 ` Simon Wright
2012-07-12 6:02 ` Egil Høvik
2012-07-12 8:29 ` Simon Wright
2012-07-12 9:00 ` Egil Høvik
2012-07-12 12:44 ` Georg Bauhaus
2012-07-12 13:20 ` Egil Høvik
2012-07-12 15:53 ` Adam Beneschan
2012-07-12 16:34 ` Dmitry A. Kazakov
2012-07-12 17:35 ` Georg Bauhaus
2012-07-19 6:44 ` David Thompson
2012-07-19 18:22 ` Simon Wright
2012-07-20 6:20 ` Georg Bauhaus
2012-07-27 19:49 ` Ada novice
2012-07-12 9:47 ` Nasser M. Abbasi
2012-05-10 13:13 ` Martin
2012-05-18 9:56 ` Marius Amado-Alves
2012-06-04 8:10 ` Yannick Duchêne (Hibou57)
2012-06-11 21:54 ` Yannick Duchêne (Hibou57)
2012-06-29 11:29 ` joachim.schroeer
2012-06-29 11:54 ` AdaMagica
2012-06-29 12:42 ` stefan-lucks
2012-06-29 15:12 ` Adam Beneschan
2012-07-03 0:47 ` Randy Brukardt
2012-06-29 12:13 ` Dmitry A. Kazakov
2012-06-29 22:37 ` Robert A Duff
2012-06-30 12:00 ` Brian Drummond
2012-06-30 12:34 ` Dmitry A. Kazakov
2012-06-30 17:00 ` Brian Drummond
2012-06-30 18:43 ` Dmitry A. Kazakov
2012-06-30 21:06 ` Brian Drummond
2012-07-01 8:17 ` Oliver Kellogg
2012-07-01 8:28 ` Pascal Obry
2012-07-01 8:25 ` Dmitry A. Kazakov
2012-07-01 10:57 ` Brian Drummond
2012-07-01 12:46 ` Dmitry A. Kazakov
2012-07-03 0:53 ` Randy Brukardt
2012-06-30 15:51 ` Robert A Duff
2012-06-30 17:37 ` Brian Drummond
2012-06-30 18:09 ` Robert A Duff
2012-06-30 18:26 ` Niklas Holsti
2012-07-01 10:47 ` Brian Drummond
2012-07-13 8:07 ` Martin
2012-07-13 11:04 ` Pascal Obry
2012-07-13 11:13 ` Martin
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox