-- Illustrates variant records with ada.text_io; use ada.text_io; with ada.integer_text_io; use ada.integer_text_io; procedure variant is type PaymentType is (Cash, Check, Credit); -- The_Type is called the discriminant of the type type Transaction(The_Type: PaymentType := Cash) is record Amount: Integer; case The_Type is when Cash => Discount: boolean := false; when Check => CheckNumber: Positive; when Credit => CardNumber: String(1..5); Expiration: String(1..5); end case; end record; t: Transaction; -- Default is cash transaction begin -- All transactions have an amount field -- put(t.amount); put(boolean'image(t.Discount)); -- Cash transactions have a discount field if t.discount then put("Give a discount"); else put("No discount"); end if; -- Create a new credit transaction t := (credit, 100, "12345", "01/05"); t.amount := 200; put(t.amount); put(t.CardNumber); put(t.Expiration); --put(t.CheckNumber); -- Compiles but raises constraint error at runtime -- t.The_Type := check; -- Compile error. -- When changing discriminant, the entire record must be assigned. end variant;