<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
It is easy to frame in terms of assignability?<BR>
  a + b is legal if a is assignable to b, or b is assignable to a  <BR>
 <BR>
If you don't allow INTEGER := LONGINT,<BR>
then you can say, like:<BR>
 <BR>
a + b is legal if a is assignable to b or b is assignable a (or both);<BR>
if a and b are of different type, and only one is assignable to the<BR>
other, then the result type is that of the assignable-to type.<BR>
 <BR>
If INTEGER := LONGINT, then I'm not sure how to formally<BR>
define the result. Something informal:<BR>
a + b is legal if a or b is assignable to the other<BR>
the result type is the "larger" or "wider" type -- whatever that means;<BR>
However, I think there is an easy enough to define set of rules.<BR>
It varies for each operator though.<BR>
 <BR>
Basically, first, the notion of "larger" or "wider" isn't<BR>
all that unscientific. It needs a little honing though;<BR>
 <BR>
 <BR>
a + b is legal if a is assignable to b or b is assignable to a (or both).<BR>
If a and b are of the same type, that is the result type.<BR>
If a and b are of different types, but one of their types can<BR>
  represent without loss all the values of the other type,<BR>
  then that is the result type.<BR>
If a and b are of different types, and neither type can represent<BR>
  all of the values of the other type, then the result type is<BR>
   INTEGER if it can represent all the members of the types of a and b,<BR>
   else LONGINT.<BR>
 <BR>
 <BR>
The result type is stated in terms of the input types.<BR>
Not in terms of the output range.<BR>
This is a general fact of life with addition anyway.<BR>
The result of adding two integers is an integer, even though integer<BR>
cannot hold the output range.<BR>
 <BR>
 <BR>
I have a strong suspicion that we would be more satisified<BR>
with our rules if overflow checking was present.<BR>
 <BR>
 <BR>
Heck, maybe we'd have something wierd where INTEGER + INTEGER<BR>
actually yielded LONGINT, but then LONGINT is assignable to INTEGER?<BR>
The overflow check would actually be at the assignment/narrowing?<BR>
Heck, it's not like double precision arithmetic is even so expensive?<BR>
 <BR>
 <BR>
What do you mean by, reworded, "the operators aren't typed"<BR>
 <BR>
 <BR>
- Jay<BR><BR> <BR>
<HR id=stopSpelling>
From: hosking@cs.purdue.edu<BR>Date: Sun, 10 Jan 2010 02:37:45 -0500<BR>To: jay.krell@cornell.edu<BR>CC: m3devel@elegosoft.com<BR>Subject: Re: [M3devel] index array by longint?<BR><BR><BASE>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span>Try to frame this in terms of assignability...</SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span><BR></SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span>If the operators themselves were typed then there would be no problem.</SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span><BR></SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span>But when they aren't we get into a real mess trying to remember what the promotion rules are.</SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span><BR></SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span>On 10 Jan 2010, at 01:11, Jay K wrote:</SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></SPAN></DIV>
<DIV><BR class=ecxApple-interchange-newline>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxhmmessage>I don't think there is madness here.<BR>I believe the half range of CARDINAL helps avoid it.<BR>A confusing point in C is comparison that includes conversion<BR>is magnitude or sign preserving -- comparing int and unsigned.<BR><BR>Back to Modula-3:<BR><BR>a := b;</DIV></SPAN></BLOCKQUOTE>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxhmmessage>c := a + d;<BR><BR>vs.<BR><BR>c := b + d;<BR><BR><BR>are different?<BR>Isn't that strange?<BR><BR><BR>Compare with<BR>a : = b;<BR>c := d[a];<BR><BR>and<BR><BR>c := d[b];<BR><BR>we have decided they are the same, among others.<BR><BR><BR>There's something about "kinda sorta transitive" here.<BR>Or, like, "why should I have to move values through temporaries in some<BR>cases but not others?"<BR><BR> - Jay<BR><BR><BR><BR>
<HR id=ecxstopSpelling>
Subject: Re: [M3devel] index array by longint?<BR>From:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>Date: Sat, 9 Jan 2010 23:46:39 -0500<BR>CC:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:rodney_bates@lcwb.coop">rodney_bates@lcwb.coop</A>;<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>To:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR><BR>
<DIV>I have a feeling that the mixed arithmetic option is losing favor.  It is a slippery slope to C madness.</DIV>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxecxApple-style-span><FONT class=ecxecxApple-style-span color=#0000ff face="'Gill Sans'"><BR></FONT></SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></SPAN></DIV>
<DIV>
<DIV>On 9 Jan 2010, at 23:42, Jay K wrote:</DIV><BR class=ecxecxApple-interchange-newline>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxecxhmmessage>There are more cases:<BR><BR>=, #, <, >, IN, etc. have this same "you can mix<BR>if they are assignable" rule.<BR><BR><A href="http://www.cs.purdue.edu/homes/hosking/m3/reference/relations.html">http://www.cs.purdue.edu/homes/hosking/m3/reference/relations.html</A><BR><BR>     infix    =, #  (x, y: Any): BOOLEAN<BR>The operator = returns TRUE if x and y are equal. The operator # returns TRUE if x and y are not equal. It is a static error if the type of x is not assignable to the type of y or vice versa.<BR>...<BR><BR><BR>Other places demand equal types:<BR><A href="http://www.cs.purdue.edu/homes/hosking/m3/reference/arithmetic.html">http://www.cs.purdue.edu/homes/hosking/m3/reference/arithmetic.html</A><BR><BR>inc/dec sound looser:<BR><A href="http://www.cs.purdue.edu/homes/hosking/m3/reference/incdec.html">http://www.cs.purdue.edu/homes/hosking/m3/reference/incdec.html</A><BR><BR><BR>I still think mixed operations are reasonable and the result types not so surprising.<BR>a := b;<BR><BR>vs. a := b + c;<BR><BR>The first is clear even if and b have different types, but the second is not, if b and c have different types?<BR>They seem pretty equally clear/unclear to me..<BR><BR><BR> - Jay<BR><BR><BR>
<HR id=ecxecxstopSpelling>
From:<SPAN class=ecxecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>Date: Sat, 9 Jan 2010 23:22:44 -0500<BR>To:<SPAN class=ecxecxApple-converted-space> </SPAN><A href="mailto:rodney_bates@lcwb.coop">rodney_bates@lcwb.coop</A><BR>CC:<SPAN class=ecxecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] index array by longint?<BR><BR>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxecxecxApple-style-span><FONT class=ecxecxecxApple-style-span color=#0000ff face="'Gill Sans'">That's very nice!  I like it.  I think we can use it....</FONT></SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></SPAN></DIV>
<DIV><BR class=ecxecxecxwebkit-block-placeholder></DIV>
<DIV>Right now I am tracking bugs in range checking.  Some were introduced by my LONGINT changes (sigh!) but others appear to have been around a while before that.</DIV>
<DIV><BR></DIV>
<DIV>For example:</DIV>
<DIV><BR></DIV>
<DIV>VAR s: CARDINAL := LAST(INTEGER);</DIV>
<DIV>BEGIN INC(s) END;</DIV>
<DIV><BR></DIV>
<DIV>did not result in a run-time error.  I think I have fixed that now (commit to come).</DIV>
<DIV><BR></DIV>
<DIV>But, even worse:</DIV>
<DIV><BR></DIV>
<DIV>VAR s: CARDINAL := LAST(INTEGER);</DIV>
<DIV>
<DIV>BEGIN WITH x = s DO x := VAL(ORD(x) + 1, CARDINAL) END END;</DIV>
<DIV><BR></DIV>
<DIV>also does not give a run-time error.</DIV>
<DIV><BR></DIV>
<DIV>The result is that you can store FIRST(INTEGER) in a CARDINAL.  Yikes!</DIV>
<DIV><BR></DIV></DIV>
<DIV>
<DIV>On 9 Jan 2010, at 21:54, Rodney M. Bates wrote:</DIV><BR class=ecxecxecxApple-interchange-newline>
<BLOCKQUOTE>
<DIV>When writing my original proposal, I agonized at length over whether<BR>to allow (subranges of) LONGINT to be the index type of an array type.  In the<BR>end, I decided that gave a poor ratio of practical benefit to language<BR>and implementation complexity.<BR><BR>However, note, from 2.6.3, "Designators,<BR><BR>"a[i]<BR>   denotes the (i + 1 - FIRST(a))-th element of the array a. The expression a[i] is a<BR>   designator if a is, and is writable if a is. The expression i must be assignable<BR>--------------------------------------------------------------------------^<BR>   to the index type of a. The type of a[i] is the element type of a."<BR><BR>So, by existing rules about assignability, when referring to an element of an<BR>array, the subscript expression could have base type LONGINT, and would just<BR>be "assigned" in the usual way to the index type, a subrange of INTEGER.<BR>This is one of the dozen or so places assignability is used in the language.<BR><BR><BR><BR>Jay K wrote:<BR>
<BLOCKQUOTE>Index array by longint?<BR></BLOCKQUOTE>
<BLOCKQUOTE>With runtime check that it is <= LAST(INTEGER)?<BR></BLOCKQUOTE>
<BLOCKQUOTE> Or really, with runtime bounds check against the array size.<BR></BLOCKQUOTE>
<BLOCKQUOTE>Seems reasonable?<BR></BLOCKQUOTE>
<BLOCKQUOTE>Aids the rd/wr change.<BR></BLOCKQUOTE>
<BLOCKQUOTE>A little bit of pain to implement..unless INTEGER and LONGINT have a common base...<BR></BLOCKQUOTE>
<BLOCKQUOTE>  - Jay<BR></BLOCKQUOTE></DIV></BLOCKQUOTE></DIV><BR></DIV></SPAN><BR class=ecxecxApple-interchange-newline></BLOCKQUOTE></DIV><BR></DIV></SPAN><BR class=ecxApple-interchange-newline></BLOCKQUOTE></DIV><BR>                                    </body>
</html>