From: Shark8 <OneWingedShark@gmail.com>
Subject: Re: A bad counterintuitive behaviour of Ada about OO
Date: Fri, 08 Aug 2014 13:34:36 -0600
Date: 2014-08-08T13:34:36-06:00 [thread overview]
Message-ID: <iD9Fv.279332$YC3.170092@fx04.iad> (raw)
In-Reply-To: <1iyw6q7texwn3$.4mgcck9beqmt.dlg@40tude.net>
On 08-Aug-14 05:20, Dmitry A. Kazakov wrote:
> And they [subtypes] break in-operations. As an example consider:
>
> X : Integer := -1;
>
> Now substitute Positive for Integer.
That's going the wrong way.
You're narrowing the set when you move to the subtype, so obviously not
all values will be present; this is a Good Thing.
For example, we can enforce consistency [and correctness] in a DB with
subtypes:
Subtype Digit is Character range '0'..'9';
-- The following is a string, of length 9, that has ONLY digits.
Subtype Social_Security_Number is String(1..9)
with Dynamic_Predicate =>
(for all C of Social_Security_Number => C in Digit);
-- The following function cannot have an invalid invalid SSN parameter.
Procedure Save( SSN : Social_Security_Number; ID: User_ID);
Function Load(ID: User_ID) return Social_Security_Number;
And this is good because we *don't* want any string in the DB's SSN
field, we only want strings which are SSNs.
Likewise, we may want Ada-like identifiers, say in a mapping:
-- Validation rules:
-- #1 - Identifier cannot be the empty-string.
-- #2 - Identifier must contain only alphanumeric characters +
underscore.
-- #3 - Identifier cannot begin with a digit.
-- #4 - Identifier cannot begin or end with an underscore.
-- #5 - Identifier cannot have two consecutive underscores.
Function Valid_Identifier(Input : String) return Boolean;
-- A string containing an identifier.
Subtype Identifier is String
with Dynamic_Predicate => Valid_Identifier( Identifier )
or else raise Constraint_Error;
-- This package defines a mapping of a name to a type; both of these
-- are instances of Identifier.
Package Attribute_List is new Ada.Containers.Indefinite_Ordered_Maps(
Key_Type => Identifier,
Element_Type => Identifier
);
-- ...in body.
Function Valid_Identifier(Input : String) return Boolean is
Subtype Internal_Range is Natural range
Input'First+1..Input'Last-1;
First : Character renames Input(Input'First);
Last : Character renames Input(Input'Last);
Use Ada.Characters.Handling;
Begin
-- Initialize w/ conformance to rule #1.
Return Result : Boolean:= Input'Length in Positive do
-- Rule 2
Result:= Result and
(For all C of Input => Is_Alphanumeric(C) OR C = '_');
-- Rule 3
Result:= Result and not Is_Decimal_Digit(First);
-- Rule 4
Result:= Result and First /= '_' and Last /= '_';
-- Rule 5
Result:= Result and
(for all Index in Internal_Range =>
(if Input(Index) = '_' then Input(Index+1) /= '_')
);
end return;
End Valid_Identifier;
And this is good.
We *don't* want to substitute STRING for Social_Security_Number or
Identifier as the values that STRING can take are outside what we want
to deal with... and if we had to deal with validation at every
subprogram-call or function-return then Ada would be little better than PHP.
> Subsetting means nothing to subtyping and both very little to
substitutability. All three are different things.
Ridiculous; as shown above subtyping *is* the subsetting of the valid
values: Social_Security_Number in particular has only 10**9 values
rather than the Σ(n=0..Positive'Last) 256**n values that the STRING type
would have.
>
> Huh, great mathematical problems are about fighting constraints. E.g.
> solving x**n + y**n = z**n in real numbers vs. in natural ones. No big
> deal? Same applies to programming, it is mostly about working around
> constraints.
...that's the most idiotic thing I've *ever* heard you say.
Constraints are fundamental for mathematical proofs; they are essential
for making robust programs. (HINT: definitions are often constraints.)
next prev parent reply other threads:[~2014-08-08 19:34 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-05 20:09 A bad counterintuitive behaviour of Ada about OO Victor Porton
2014-08-05 20:58 ` Simon Wright
2014-08-05 21:06 ` Victor Porton
2014-08-05 21:51 ` Niklas Holsti
2014-08-05 22:13 ` Victor Porton
2014-08-05 22:35 ` Victor Porton
2014-08-05 23:25 ` Adam Beneschan
2014-08-05 20:59 ` Dmitry A. Kazakov
2014-08-05 21:07 ` Victor Porton
2014-08-05 22:39 ` Shark8
2014-08-05 21:11 ` Victor Porton
2014-08-06 7:26 ` Dmitry A. Kazakov
2014-08-07 7:41 ` Maciej Sobczak
2014-08-07 8:50 ` Dmitry A. Kazakov
2014-08-08 7:54 ` Maciej Sobczak
2014-08-08 8:14 ` Dmitry A. Kazakov
2014-08-08 13:06 ` Maciej Sobczak
2014-08-08 13:22 ` Dmitry A. Kazakov
2014-08-08 22:32 ` Randy Brukardt
2014-08-09 16:11 ` Maciej Sobczak
2014-08-09 16:48 ` Dmitry A. Kazakov
2014-08-10 20:55 ` Maciej Sobczak
2014-08-11 7:41 ` Dmitry A. Kazakov
2014-08-11 7:58 ` Maciej Sobczak
2014-08-11 8:23 ` Dmitry A. Kazakov
2014-08-12 7:50 ` Maciej Sobczak
2014-08-11 11:35 ` G.B.
2014-08-08 22:26 ` Randy Brukardt
2014-08-08 8:34 ` Shark8
2014-08-08 12:59 ` Maciej Sobczak
2014-08-08 22:37 ` Randy Brukardt
2014-08-08 22:53 ` Jeffrey Carter
2014-08-07 8:58 ` J-P. Rosen
2014-08-07 9:40 ` Dmitry A. Kazakov
2014-08-07 11:17 ` J-P. Rosen
2014-08-07 12:28 ` Dmitry A. Kazakov
2014-08-07 13:34 ` J-P. Rosen
2014-08-07 16:10 ` Dmitry A. Kazakov
2014-08-07 18:14 ` Robert A Duff
2014-08-07 19:41 ` Dmitry A. Kazakov
2014-08-07 20:53 ` Robert A Duff
2014-08-08 7:43 ` Dmitry A. Kazakov
2014-08-08 8:18 ` Shark8
2014-08-08 7:45 ` J-P. Rosen
2014-08-08 8:04 ` Dmitry A. Kazakov
2014-08-08 8:55 ` J-P. Rosen
2014-08-08 9:13 ` Dmitry A. Kazakov
2014-08-08 10:01 ` J-P. Rosen
2014-08-08 10:53 ` Dmitry A. Kazakov
2014-08-08 10:56 ` Victor Porton
2014-08-08 12:00 ` J-P. Rosen
2014-08-08 13:11 ` Dmitry A. Kazakov
2014-08-08 13:53 ` J-P. Rosen
2014-08-08 20:23 ` Dmitry A. Kazakov
2014-08-07 20:29 ` Shark8
2014-08-08 7:49 ` J-P. Rosen
2014-08-08 8:12 ` Shark8
2014-08-08 8:26 ` Dmitry A. Kazakov
2014-08-08 11:10 ` Shark8
2014-08-08 11:20 ` Dmitry A. Kazakov
2014-08-08 19:34 ` Shark8 [this message]
2014-08-08 20:23 ` Dmitry A. Kazakov
2014-08-07 15:03 ` Jeffrey Carter
2014-08-08 7:48 ` Maciej Sobczak
2014-08-08 8:51 ` J-P. Rosen
2014-08-08 13:25 ` Maciej Sobczak
2014-08-08 13:34 ` J-P. Rosen
2014-08-08 13:52 ` Dmitry A. Kazakov
2014-08-08 14:21 ` J-P. Rosen
2014-08-08 20:23 ` Dmitry A. Kazakov
2014-08-08 22:08 ` Randy Brukardt
2014-08-08 22:18 ` Randy Brukardt
2014-08-06 4:50 ` Per Sandberg
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox