comp.lang.ada
 help / color / mirror / Atom feed
From: Duke Normandin <dukeofperl@ml1.net>
Subject: Re: Noob question: universal_integer type
Date: Sat, 22 May 2010 13:04:03 GMT
Date: 2010-05-22T13:04:03+00:00	[thread overview]
Message-ID: <7DQJn.4466$Z6.1110@edtnps82> (raw)
In-Reply-To: 85pemlFod9U1@mid.individual.net

On 2010-05-22, Niklas Holsti <niklas.holsti@tidorum.invalid> wrote:
> Jeffrey R. Carter wrote:
>> Duke Normandin wrote:
>>>
>>> Let me get this right... if I use an undeclared integer in an expression,
>>> Ada will "deem it" to be a "universal_integer" and not choke at
>>> compile-time?
>> 
>> I don't know, and I've been using Ada since 1984. What is "an undeclared 
>> integer"?
>> 
>> 17 is an integer literal; all integer literals are universal_integer. 17 
>> is not an undeclared integer.
>> 
>> What the tutorial is trying to get across is that Ada, unlike some 
>> languages, does not have typed numeric literals (see also 
>> universal_real). You might encounter a language in which 10 is a literal 
>> of type int and 10L a literal of long int, for example. In Ada, all 
>> integer literals are universal_integer, and implicitly converted to 
>> specific integer types as required.
>> 
>> Partly this makes life easier: you can change the type of a variable and 
>> not have to change all the literals used with that variable; and partly 
>> it's pretty much needed in a language that lets you define your own 
>> numeric types.
>
> Perhaps it is also worth mentioning that Ada does have a way of 
> explicitly indicating the type to be chosen for a literal, by 
> "qualifying" it with a type name. This can be necessary to resolve 
> overloaded operation names. For example, assume that you define two 
> integer types:
>
>     type Apples is range 0 .. 20;
>     type Ants is range 0 .. 1_000_000;
>
> and then define a procedure "Eat" for each type, with different content 
> for eating apples and for eating ants:
>
>     procedure Eat (Items : Apples) ... end Eat;
>
>     procedure Eat (Items : Ants) ... end Eat;
>
> A call of Eat with a literal parameter, for example Eat (17), is then 
> ambiguous (and the compiler will tell you so). To show if you are eating 
> apples or ants, you qualify the literal with the type name and an 
> apostrophe, as in
>
>     Eat (Apples'(17));
>
> for eating 17 apples, or
>
>     Eat (Ants'(17))
>
> for eating 17 ants. Since the type of the parameter is now explicit, the 
> compiler knows which procedure Eat is to be called.
>


I love it! and the compiler would choke with an "out of bounds" exception if
you called Eat (Apples'(25)); - if I understand the Coronado tutorial
correctly. Thanks for the input...
-- 
Duke Normandin 
*** Tolerance becomes a crime, when applied to evil [Thomas Mann] *** 




  reply	other threads:[~2010-05-22 13:04 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-21 23:15 Noob question: universal_integer type Duke Normandin
2010-05-21 23:33 ` Yannick Duchêne (Hibou57)
2010-05-21 23:34   ` Yannick Duchêne (Hibou57)
2010-05-21 23:37 ` Jeffrey R. Carter
2010-05-22  2:04   ` Duke Normandin
2010-05-22  7:16   ` Niklas Holsti
2010-05-22 13:04     ` Duke Normandin [this message]
2010-05-22 13:47       ` Dmitry A. Kazakov
2010-05-22 14:51         ` Duke Normandin
2010-05-22 20:08       ` Yannick Duchêne (Hibou57)
2010-05-23  2:28         ` Duke Normandin
2010-05-23  2:36           ` Yannick Duchêne (Hibou57)
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox