CVS difference for ai05s/ai05-0158-1.txt

Differences between 1.5 and version 1.6
Log of other versions for file ai05s/ai05-0158-1.txt

--- ai05s/ai05-0158-1.txt	2009/11/03 00:19:50	1.5
+++ ai05s/ai05-0158-1.txt	2010/01/21 05:25:54	1.6
@@ -1,6 +1,7 @@
-!standard 3.8.1(5)                                 09-11-02    AI05-0158-1/03
+!standard 3.8.1(5)                                 10-01-20    AI05-0158-1/04
 !standard 4.4(3)
 !standard 4.5.2(3)
+!standard 4.5.2(5)
 !standard 4.5.2(27)
 !class Amendment 09-06-07
 !status work item 09-06-07
@@ -11,17 +12,25 @@
 
 !summary
 
-Extend the syntax of membership tests to simplify complex conditions that can
-be expressed as membership in a subset of values of any type.
+Extend the syntax of membership tests to simplify complex conditions that can
+be expressed as membership in a subset of values of any type. Introduce syntax
+for a list of expressions that may be used in loop contexts as well.
 
 !problem
 
-Conditions of the form  (X = A) or else (X = B) or else (X = C) where A, B, C
-are of some arbitrary type are common, and will be more frequent when
-pre- and post-conditions become widely used. If the values of A, B,and C are
-contiguous values of some discrete type, the expression can be
-written as a membership operation: (X in A..C) .  Otherwise this syntactic
-shortcut is not available. Memberships should be more flexible.
+Conditions of the form  (X = A) or else (X = B) or else (X = C) where A, B, C
+are of some arbitrary type are common, and will be more frequent when
+pre- and post-conditions become widely used. If the values of A, B,and C are
+contiguous values of some discrete type, the expression can be
+written as a membership operation: (X in A..C) .  Otherwise this syntactic
+shortcut is not available. We propose a simple extension of the syntax of
+membership operations, so that the right operand can specify a subset of values
+of some type. The type does not need to be discrete, and the choices do not
+need to be static, so that one can write:
+
+if C not in 'A' | 'B' | 'O' then  Put_Line ("invalid blood type"); else ..
+
+while Name (1 .. N) in T.Element (X) | T.Element (Y) | T.Element (Z)  loop ...
 
 !proposal
 
@@ -54,7 +63,7 @@
      simple_expression [relational_operator simple_expression]
 
   relation ::=
-     simple_expression [not] in choice_list
+     simple_expression [not] in membership_choice_list
 
   membership_choice_list ::= membership_choice {'|' membership_choice}
 
@@ -69,15 +78,34 @@
 choice, then all choices must have a single common type, which is the tested
 type of the operation.
 
+Add after 4.5.2 (5)  (Static semantics)
+
+The expected type of a choice_expression in a membership_choice is any type.
+
 Modify 4.5.2(27) as follows:
 
 If the choice_list has a single choice, the simple expression and the choice
-are elaborated in arbitrary order.
+are elaborated in arbitrary order.
+
 If the choice_list has more that one choice, the left operand is elaborated
-first and the operation is equivalent to a short-circuit sequence of tests :
-if a choice is a restricted expression the
-corresponding test is an equality operation, otherwise it is a membership test
-whose right operand is the corresponding range or subtype_mark.
+first and the operation is equivalent to a short-circuit sequence of
+individual tests on each choice.
+
+Modify 4.5.2 (28) as follows:
+
+A membership test using in yields the result True if any of the individual
+tests on the elements of the choice list yields True.
+
+An individual membership test yields the result True if:
+
+* The choice is an expression, and the simple_expression is equal to the value 
+  of the choice. If the type of the expression is a record type or a limited
+  type, the test uses the primitive equality for the type; otherwise the test
+  uses predefined equality.
+
+* The choice is a range or subtype mark and:
+
+(followed by para. 29-30)
 
 !discussion
 
@@ -97,6 +125,18 @@
 Even though this is a contrived example, unlikely to show up in realistic
 code, it seems preferable to modify the grammar as shown above.
 
+There was a suggestion that the type of an expression in a choice should be
+non-limited. However, given that currently a subtype_mark in a choice can be
+of any type, it would be awkward to introduce this restriction. Clearly if
+the type has no primitive equality a membership test over a list of expressions
+is illegal.
+
+[Editor's note: This decision brings visibility into the legality of membership
+operations. That seems like a lousy choice (pun intended). Personally, I would
+prefer the inconsistency. (Well, I'd prefer AI-153-2 instead of this one, which
+would require these to be discrete only, but make them work *everywhere*. But
+that's a separate issue.)]
+
 !example
 
 (See proposal.)
@@ -227,6 +267,19 @@
 If they're only for static discrete types (as in case statements, based on
 Tucker's responses), then I surely agree that they're easy to implement. I'm not
 so sure in other cases.
+
+****************************************************************
+
+From: Robert Dewar
+Date: Monday, March 30, 2009  10:11 PM
+
+> If they're only for static discrete types (as in case statements, 
+> based on Tucker's responses), then I surely agree that they're easy to 
+> implement. I'm not so sure in other cases.
+
+I gave a semantic equivalence, and no, it is not acceptable to limit these to
+static values, but of course they are limited to discrete types, that goes
+without saying.
 
 ****************************************************************
 

Questions? Ask the ACAA Technical Agent