From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=BAYES_00,INVALID_MSGID, MSGID_RANDY autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,c7ea1cb7a2beb2ee X-Google-Attributes: gid103376,public From: mark_biggar@my-deja.com Subject: Re: Disallowing Pre-Defined Operations Date: 2000/03/10 Message-ID: <8ab99b$m4i$1@nnrp1.deja.com>#1/1 X-Deja-AN: 595740506 References: <8a9eeg$qtv$1@newpoisson.nosc.mil> X-Http-Proxy: HTTP/1.1 sji-ca-cache[0A000002] (Traffic-Server/2.2 [uScMs f p eN:t cSMi p s ]), 1.0 x32.deja.com:80 (Squid/1.1.22) for client 165.236.189.201 Organization: Deja.com - Before you buy. X-Article-Creation-Date: Fri Mar 10 16:53:01 2000 GMT X-MyDeja-Info: XMYDJUIDmark_biggar Newsgroups: comp.lang.ada X-Http-User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98) Date: 2000-03-10T00:00:00+00:00 List-Id: In article <8a9eeg$qtv$1@newpoisson.nosc.mil>, claveman@cod.nosc.mil (Charles H. Sampson) wrote: > During the deliberations that led to Ada 95, was a mechanism for > disallowing the pre-defined operations of a type considered? By "disal- > lowing" I mean some way of informing the compiler that an attempt to use > a certain pre-defined operation is a compile-time error. Did anyone > even ask for it? (Obviously I didn't, even though I've thought since > the mid-eighties that it would be a useful capability to have.) > > As an example of what I'm talking about, consider a package that > implements three distinct floating-points types for measuring length, > area, and volume. The pre-defined "+" and "-" are acceptable and there > are obvious redefinitions of "*" and "/" in some cases. However, the > pre-defined "/" for operands of the same type don't make sense and it > would be nice to get a compile-time warning if one of them is used. > Yes, a redefinition that raises an exception can be written, but that's > not the same thing. > > In the case that's bothering me at the moment, my project has a > type called Time_Type. (We can't be assured that Ada's built-in time > types are adequate for our purposes.) We've already had one fairly dif- > ficult bug because a variable of this type was used to hold the differ- > ence between two values of the type, known in our environment as a > delta-time. Now defining a new type Delta_Time_Type and the set of Cal- endar-like operations is no big deal, but I have no way of telling the > compiler to flag such things as the pre-defined > > function "-" (L, R : Time_Type) return Time_Type; > > and the "*", "/", and "**" operations on values of these types. > > Declaring the types as private doesn't work. The types are inher- > ently (and obviously) numeric and nobody on my project would want to > lose the ability to use numeric literals when appropriate. (Every time > this issue has popped up for me over the last 15+ years, it's been in > the context of numeric types.) Whenever time I come up with a way of > pluging one hole, it opens another. For example, overloading "-" as > > function "-" (L : Time_Type; R : Float) return Delta_Time_Type; > > would allow any value of type Float to be subtracted, not just literals. > > Does it tell you something about my project when I say that if the > above definition of "-" were used, I'm sure somebody would discover the > hole and figure out some "clever" way of exploiting it? Easy: just define the operator as abstract. E.g.,: type Length is new Integer; function "*"(Left,Right: Length) return Length is abstract; function "/"(Left,Right: Length) return Length is abstract; -- now we define what we really want function "/"(left,Right: Length) return Integer; type Area is new Integer; function "*"(Left,Right: Length) return Area; -- etc. -- Mark Biggar mark@biggar.org Sent via Deja.com http://www.deja.com/ Before you buy.