<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>One thing I missed is that<BR> <BR> <BR>IMPORT M3CG;  <BR> <BR> <BR>Give you an M3CG.T that you can only pass around.  <BR> <BR>  Add IMPORT M3CG_Ops I think it was  <BR>  and then you can make all the method calls on an M3CG.T.  <BR> <BR> I don't see that the first intermediate step is useful, but oh well.<BR> Everyone might as well just IMPORT M3CG_Ops.<BR> <BR> <BR> It is kind of interesting that "private" and "protected" are kind of available in Modula-3, or at least    one clump therein, by moving part of the interface into a separate file.<BR> <BR>  I say one clump, because I don't think you can do this:  <BR> <BR> <BR>  FooRoot.i3:  <BR>  TYPE Foo <: ROOT;  <BR> <BR>Foo1.i3:<BR>  TYPE Foo <: OBJECT METHODS  <BR>  PROCEDURE F1();  <BR>  END;<BR> <BR>Foo2.i3:<BR>TYPE Foo <: OBJECT METHODS<BR>PROCEDURE F2();<BR>END;<BR> <BR>Foo.m3: <BR>  REVEAL Foo = OBJECT METHODS  <BR>  PROCEDURE F1();  <BR>  PROCEDURE F2();  <BR>  END;<BR> <BR>  I think you can only have just:  <BR> <BR>  FooRoot.i3:  <BR>    TYPE Foo <: ROOT;    <BR> <BR>  Foo1.i3:  <BR>    TYPE Foo <: OBJECT METHODS    <BR>    PROCEDURE F1();    <BR>    END;  <BR> <BR>Foo.m3:<BR>    REVEAL Foo = OBJECT METHODS    <BR>     PROCEDURE F1();    <BR>      PROCEDURE F2(); <BR>    END;  <BR> <BR> <BR>  It'd also be useful if you could do like this:    <BR> <BR>  Stream.i3:  <BR> <BR>  Reader = OBJECT METHODS PROCEDURE Read(); END;  <BR>  Writer = OBJECT METHODS PROCEDURE Write(); END;  <BR>  TYPE Stream <: Reader;  <BR>  TYPE Stream <: Writer;  <BR> <BR>Stream.m3:<BR>  REVEAL Stream = OBJECT METHODS  <BR>  PROCEDURE Read();  <BR>  PROCEDURE Write();  <BR>  END;<BR> <BR>i.e. -- multiple inheritance.<BR> <BR>I realize you can reveal in multiple linear steps though...which I'm not going to give an example of right now.. so it isn't just "one clump", but if you reveal "multiple clumps", they need to form a linear chain, right? You can't "mix" as I showed for read/write. ?<BR> <BR>  <BR> - Jay<br> <BR><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">From: jay.krell@cornell.edu<br>To: hosking@cs.purdue.edu<br>Date: Thu, 27 Sep 2012 05:14:27 +0000<br>CC: m3devel@elegosoft.com<br>Subject: Re: [M3devel] M3CG_Ops.Public vs. M3CG.T<br><br>

<style><!--
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:12pt;font-family:Calibri;}

--></style>
<div dir="ltr"><div><font face="Calibri, sans-serif">No. I'm ok with that.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">My point is, that basically, there are two really good forms of</font></div><div><font face="Calibri, sans-serif">interface that have the right level of revelation and hiding.</font></div><div><font face="Calibri, sans-serif">I don't see much point for in-between.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">The two forms..they are kind of canonical C and C++ forms, but</font></div><div><font face="Calibri, sans-serif">they both map to Modula-3.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">One form is a fully opaque type and a bunch of functions</font></div><div><font face="Calibri, sans-serif">that take that type as the first parameter.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Like this:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">    struct Window_t;    </font></div><div><font face="Calibri, sans-serif">    typedef struct Window_t* Window_t;    </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">    Window_t* Window_Create(...);    /* create is special -- first parameter</font></div><div><font face="Calibri, sans-serif">       isn't Window_t* */  </font></div><div><font face="Calibri, sans-serif">    void Window_Close(Window_t*...);    </font></div><div><font face="Calibri, sans-serif">    void Window_SetTitle(Window_t*...);    </font></div><div><font face="Calibri, sans-serif">    TEXT Window_GetTitle(Window_t*...);    </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">It maps directly to Modula-3.</font></div><div><font face="Calibri, sans-serif">Though I'm not sure exactly how.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Window.i3:</font></div><div><font face="Calibri, sans-serif">INTERFACE Window;</font></div><div><font face="Calibri, sans-serif">TYPE T <: ROOT;</font></div><div><font face="Calibri, sans-serif">PROCEDURE Close(T);</font></div><div><font face="Calibri, sans-serif">PROCEDURE SetTitle(T, TEXT);</font></div><div><font face="Calibri, sans-serif">PROCEDURE GetTitle(T): TEXT;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">The other form is a bunch of pure virtual functions, no</font></div><div><font face="Calibri, sans-serif">data, no non-virtual functions. This is what COM prescribes.</font></div><div><font face="Calibri, sans-serif">And "Create" is special.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">struct Window_t</font></div><div><font face="Calibri, sans-serif">{</font></div><div><font face="Calibri, sans-serif">    virtual void Close() = 0;</font></div><div><font face="Calibri, sans-serif">    virtual void SetTitle(TEXT) = 0;</font></div><div><font face="Calibri, sans-serif">    virtual TEXT GetTitle() = 0;</font></div><div><font face="Calibri, sans-serif">};</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Window_t* Window_Create(...);</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">This maps well to Modula-3 as well:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Window.i3:</font></div><div><font face="Calibri, sans-serif">T <: OBJECT</font></div><div><font face="Calibri, sans-serif">  METHODS</font></div><div><font face="Calibri, sans-serif">    PROCEDURE Close();</font></div><div><font face="Calibri, sans-serif">    PROCEDURE SetTitle(TEXT);</font></div><div><font face="Calibri, sans-serif">    PROCEDURE GetTitle(): TEXT;</font></div><div><font face="Calibri, sans-serif">END;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">The in-between, which I'm not sure is all that worthwhile,</font></div><div><font face="Calibri, sans-serif">is where C++ offers "protected", and "worse", "private".</font></div><div><font face="Calibri, sans-serif">Really "private" doesn't belong in a header.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">In the case of M3CG, I don't think we have any need for in-between.</font></div><div><font face="Calibri, sans-serif">I think currently clients either know it is <: ROOT or <: Ops.Public.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">I don't see the point in hiding <: Ops.Public.</font></div><div><font face="Calibri, sans-serif">You might as well let every client know that.</font></div><div><font face="Calibri, sans-serif">They just pass them around by value/reference, and not call</font></div><div><font face="Calibri, sans-serif">any methods/member-functions, but I don't see that hiding</font></div><div><font face="Calibri, sans-serif">them helps anything.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Typical "operating system" interfaces look like what I showed first,</font></div><div><font face="Calibri, sans-serif">except that Window_t* is replaced by "int" or "void*". Which I think is</font></div><div><font face="Calibri, sans-serif">mostly inferior. void* at least allows for basically the same implementation</font></div><div><font face="Calibri, sans-serif">strategies, including casting it to int and indexing into a table, but</font></div><div><font face="Calibri, sans-serif">having different pointer types allows for a little bit of type-safety</font></div><div><font face="Calibri, sans-serif">in the clients (i.e. avoiding passing a Windows_t* to File_Read).</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><br></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> - Jay</font></div><br><br><br><br><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><div id="ecxSkyDrivePlaceholder"></div><hr id="ecxstopSpelling">From: hosking@cs.purdue.edu<br>Date: Wed, 26 Sep 2012 15:53:26 -0400<br>To: jay.krell@cornell.edu<br>CC: m3devel@elegosoft.com<br>Subject: Re: [M3devel] M3CG_Ops.Public vs. M3CG.T<br><br>Are you saying that you don’t like importing M3CG as well as M3CG_Ops?<br><br>
<br><div><div>On Sep 26, 2012, at 3:30 PM, Jay <<a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>> wrote:</div><br class="ecxApple-interchange-newline"><blockquote><div><div>Ok but this seems not great..<br><br> - Jay (briefly/pocket-sized-computer-aka-phone)</div><div><br>On Sep 26, 2012, at 8:58 AM, Antony Hosking <<a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a>> wrote:<br><br></div><div></div><blockquote>Yes, M3CG.T is the most abstract type.<div>Please don’t make this change.<br>
<br><div><div>On Sep 26, 2012, at 11:36 AM, Jay K <<a href="mailto:jay.krell@cornell.edu"></a><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>> wrote:</div><br class="ecxApple-interchange-newline"><blockquote><div style="font: 12pt/normal Calibri; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal;" class="ecxhmmessage"><div dir="ltr"><font size="3" face="Calibri, sans-serif">It is not pervasive.</font><div style="font-family: Calibri, sans-serif; font-size: 12pt;">It is like one line in about six files. M3CG.T => M3CG_Ops.Publics.</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">I guess you are saying that M3CG.T is merely the extremely abstract ROOT, where M3CG_Ops.Public has a bunch of methods? Then I might argue that M3CG.T is overly abstract -- it is like void* instead of pointer just with a bunch of methods.</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">This isn't quite right, doesn't compilte, but rougly:</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div><div><font face="Calibri, sans-serif">Index: M3CG_BinRd.i3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinRd.i3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.2</font></div><div><font face="Calibri, sans-serif">diff -u -r1.2 M3CG_BinRd.i3</font></div><div><font face="Calibri, sans-serif">--- M3CG_BinRd.i3<span style="white-space: pre;" class="ecxApple-tab-span">    </span>12 Feb 2001 15:25:47 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.2</font></div><div><font face="Calibri, sans-serif">+++ M3CG_BinRd.i3<span style="white-space: pre;" class="ecxApple-tab-span">      </span>26 Sep 2012 15:34:32 -0000</font></div><div><font face="Calibri, sans-serif">@@ -3,9 +3,9 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> INTERFACE M3CG_BinRd;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-IMPORT M3CG, Rd;</font></div><div><font face="Calibri, sans-serif">+IMPORT M3CG_Ops, Rd;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE Inhale (rd: Rd.T;  cg: M3CG.T);</font></div><div><font face="Calibri, sans-serif">+PROCEDURE Inhale (rd: Rd.T;  cg: M3CG_Ops.Public);</font></div><div><font face="Calibri, sans-serif"> (* Parse the binary intermediate code M3CG calls from 'rd'</font></div><div><font face="Calibri, sans-serif">    and call 'cg' to implement them. *)</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">Index: M3CG_BinRd.m3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinRd.m3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.19</font></div><div><font face="Calibri, sans-serif">diff -u -r1.19 M3CG_BinRd.m3</font></div><div><font face="Calibri, sans-serif">--- M3CG_BinRd.m3<span style="white-space: pre;" class="ecxApple-tab-span">     </span>4 Sep 2012 14:29:54 -0000<span style="white-space: pre;" class="ecxApple-tab-span">      </span>1.19</font></div><div><font face="Calibri, sans-serif">+++ M3CG_BinRd.m3<span style="white-space: pre;" class="ecxApple-tab-span">     </span>26 Sep 2012 15:34:32 -0000</font></div><div><font face="Calibri, sans-serif">@@ -20,7 +20,7 @@</font></div><div><font face="Calibri, sans-serif"> TYPE</font></div><div><font face="Calibri, sans-serif">   State = RECORD</font></div><div><font face="Calibri, sans-serif">     rd     : Rd.T;</font></div><div><font face="Calibri, sans-serif">-    cg     : M3CG.T;</font></div><div><font face="Calibri, sans-serif">+    cg     : M3CG_Ops.Public;</font></div><div><font face="Calibri, sans-serif">     buf    : InputBuffer;</font></div><div><font face="Calibri, sans-serif">     buf_len: CARDINAL;</font></div><div><font face="Calibri, sans-serif">     buf_ptr: CARDINAL;</font></div><div><font face="Calibri, sans-serif">@@ -200,7 +200,7 @@</font></div><div><font face="Calibri, sans-serif">     Cmd {Bop.fetch_and_xor,  fetch_and_xor}</font></div><div><font face="Calibri, sans-serif">   };</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE Inhale (rd: Rd.T;  cg: M3CG.T) =</font></div><div><font face="Calibri, sans-serif">+PROCEDURE Inhale (rd: Rd.T;  cg: M3CG_Ops.Public) =</font></div><div><font face="Calibri, sans-serif">   VAR s: State;  op: M3CG.Name;  cmd: INTEGER;</font></div><div><font face="Calibri, sans-serif">   BEGIN</font></div><div><font face="Calibri, sans-serif">     s.rd      := rd;</font></div><div><font face="Calibri, sans-serif">Index: M3CG_BinWr.i3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinWr.i3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.2</font></div><div><font face="Calibri, sans-serif">diff -u -r1.2 M3CG_BinWr.i3</font></div><div><font face="Calibri, sans-serif">--- M3CG_BinWr.i3<span style="white-space: pre;" class="ecxApple-tab-span">    </span>12 Feb 2001 15:25:47 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.2</font></div><div><font face="Calibri, sans-serif">+++ M3CG_BinWr.i3<span style="white-space: pre;" class="ecxApple-tab-span">      </span>26 Sep 2012 15:34:32 -0000</font></div><div><font face="Calibri, sans-serif">@@ -3,9 +3,9 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> INTERFACE M3CG_BinWr;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-IMPORT M3CG, Wr;</font></div><div><font face="Calibri, sans-serif">+IMPORT M3CG_Ops, Wr;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE New (wr: Wr.T): M3CG.T;</font></div><div><font face="Calibri, sans-serif">+PROCEDURE New (wr: Wr.T): M3CG_Ops.Public;</font></div><div><font face="Calibri, sans-serif"> (* returns a fresh, initialized code generator that writes its</font></div><div><font face="Calibri, sans-serif">    calls as binary intermediate code on 'wr'.  See M3CG_Binary</font></div><div><font face="Calibri, sans-serif">    for the binary format.  *)</font></div><div><font face="Calibri, sans-serif">Index: M3CG_BinWr.m3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_BinWr.m3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.23</font></div><div><font face="Calibri, sans-serif">diff -u -r1.23 M3CG_BinWr.m3</font></div><div><font face="Calibri, sans-serif">--- M3CG_BinWr.m3<span style="white-space: pre;" class="ecxApple-tab-span">       </span>4 Sep 2012 15:20:09 -0000<span style="white-space: pre;" class="ecxApple-tab-span">      </span>1.23</font></div><div><font face="Calibri, sans-serif">+++ M3CG_BinWr.m3<span style="white-space: pre;" class="ecxApple-tab-span">     </span>26 Sep 2012 15:34:32 -0000</font></div><div><font face="Calibri, sans-serif">@@ -27,7 +27,7 @@</font></div><div><font face="Calibri, sans-serif">   END;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> TYPE</font></div><div><font face="Calibri, sans-serif">-  U = M3CG.T OBJECT</font></div><div><font face="Calibri, sans-serif">+  U = M3CG_Ops.Public OBJECT</font></div><div><font face="Calibri, sans-serif">         wr            : Wr.T := NIL;</font></div><div><font face="Calibri, sans-serif">         buf           : M3Buf.T := NIL;</font></div><div><font face="Calibri, sans-serif">         buf_len       : INTEGER := 0;</font></div><div><font face="Calibri, sans-serif">@@ -375,7 +375,7 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> (*---------------------------------------------------------------------------*)</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE New (output: Wr.T): M3CG.T =</font></div><div><font face="Calibri, sans-serif">+PROCEDURE New (output: Wr.T): M3CG_Ops.Public =</font></div><div><font face="Calibri, sans-serif">   VAR mbuf := M3Buf.New ();</font></div><div><font face="Calibri, sans-serif">   BEGIN</font></div><div><font face="Calibri, sans-serif">     M3Buf.AttachDrain (mbuf, output);</font></div><div><font face="Calibri, sans-serif">Index: M3CG_Check.i3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Check.i3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.1.1.1</font></div><div><font face="Calibri, sans-serif">diff -u -r1.1.1.1 M3CG_Check.i3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Check.i3<span style="white-space: pre;" class="ecxApple-tab-span">        </span>14 Jan 2001 13:40:37 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.1.1.1</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Check.i3<span style="white-space: pre;" class="ecxApple-tab-span">  </span>26 Sep 2012 15:34:32 -0000</font></div><div><font face="Calibri, sans-serif">@@ -7,11 +7,11 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> INTERFACE M3CG_Check;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-IMPORT M3CG;</font></div><div><font face="Calibri, sans-serif">+IMPORT M3CG_Ops;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE New (child: M3CG.T;</font></div><div><font face="Calibri, sans-serif">+PROCEDURE New (child: M3CG_Ops.Public;</font></div><div><font face="Calibri, sans-serif">                clean_jumps, clean_stores: BOOLEAN;</font></div><div><font face="Calibri, sans-serif">-               nested_calls, nested_procs: BOOLEAN): M3CG.T;</font></div><div><font face="Calibri, sans-serif">+               nested_calls, nested_procs: BOOLEAN): M3CG_Ops.Public;</font></div><div><font face="Calibri, sans-serif"> (* returns a fresh, initialized code generator that passes its calls</font></div><div><font face="Calibri, sans-serif">    to 'child' and checks that the stream obeys the M3CG restrictions.</font></div><div><font face="Calibri, sans-serif">    If 'clean_jumps', it also checks that the stack is empty at every</font></div><div><font face="Calibri, sans-serif">Index: M3CG_Check.m3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Check.m3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.17</font></div><div><font face="Calibri, sans-serif">diff -u -r1.17 M3CG_Check.m3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Check.m3<span style="white-space: pre;" class="ecxApple-tab-span">        </span>4 Sep 2012 14:47:43 -0000<span style="white-space: pre;" class="ecxApple-tab-span">      </span>1.17</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Check.m3<span style="white-space: pre;" class="ecxApple-tab-span">     </span>26 Sep 2012 15:34:33 -0000</font></div><div><font face="Calibri, sans-serif">@@ -32,7 +32,7 @@</font></div><div><font face="Calibri, sans-serif">   };</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> TYPE</font></div><div><font face="Calibri, sans-serif">-  U = M3CG.T OBJECT</font></div><div><font face="Calibri, sans-serif">+  U = M3CG_Ops.Public OBJECT</font></div><div><font face="Calibri, sans-serif">         clean_stores := FALSE;</font></div><div><font face="Calibri, sans-serif">         clean_jumps  := FALSE;</font></div><div><font face="Calibri, sans-serif">         nested_calls := TRUE;</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Ops.i3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.12</font></div><div><font face="Calibri, sans-serif">diff -u -r1.12 M3CG_Ops.i3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Ops.i3<span style="white-space: pre;" class="ecxApple-tab-span">    </span>16 Aug 2012 13:12:35 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.12</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Ops.i3<span style="white-space: pre;" class="ecxApple-tab-span">       </span>26 Sep 2012 15:34:33 -0000</font></div><div><font face="Calibri, sans-serif">@@ -30,7 +30,7 @@</font></div><div><font face="Calibri, sans-serif">   Public = OBJECT</font></div><div><font face="Calibri, sans-serif"> (*------------------------------------------------ READONLY configuration ---*)</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-child: M3CG.T := NIL;</font></div><div><font face="Calibri, sans-serif">+child: Public := NIL;</font></div><div><font face="Calibri, sans-serif"> (* The default methods simply call the corresponding method in 'child',</font></div><div><font face="Calibri, sans-serif">    hence a vanilla 'M3CG.T' can be used as a filter where you override</font></div><div><font face="Calibri, sans-serif">    only the methods of interest. *)</font></div><div><font face="Calibri, sans-serif">Index: M3CG_Rd.i3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Rd.i3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.1.1.1</font></div><div><font face="Calibri, sans-serif">diff -u -r1.1.1.1 M3CG_Rd.i3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Rd.i3<span style="white-space: pre;" class="ecxApple-tab-span">  </span>14 Jan 2001 13:40:37 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.1.1.1</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Rd.i3<span style="white-space: pre;" class="ecxApple-tab-span">     </span>26 Sep 2012 15:34:33 -0000</font></div><div><font face="Calibri, sans-serif">@@ -7,9 +7,9 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> INTERFACE M3CG_Rd;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-IMPORT M3CG, Rd;</font></div><div><font face="Calibri, sans-serif">+IMPORT M3CG_Ops, Rd;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE Inhale (rd: Rd.T;  cg: M3CG.T);</font></div><div><font face="Calibri, sans-serif">+PROCEDURE Inhale (rd: Rd.T;  cg: M3CG_Ops.Public);</font></div><div><font face="Calibri, sans-serif"> (* Parse the M3CG calls from 'rd' and call 'cg' to implement them. *)</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> END M3CG_Rd.</font></div><div><font face="Calibri, sans-serif">Index: M3CG_Rd.m3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Rd.m3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.15</font></div><div><font face="Calibri, sans-serif">diff -u -r1.15 M3CG_Rd.m3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Rd.m3<span style="white-space: pre;" class="ecxApple-tab-span">        </span>4 Sep 2012 14:52:46 -0000<span style="white-space: pre;" class="ecxApple-tab-span">      </span>1.15</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Rd.m3<span style="white-space: pre;" class="ecxApple-tab-span">        </span>26 Sep 2012 15:34:33 -0000</font></div><div><font face="Calibri, sans-serif">@@ -22,7 +22,7 @@</font></div><div><font face="Calibri, sans-serif"> TYPE</font></div><div><font face="Calibri, sans-serif">   State = RECORD</font></div><div><font face="Calibri, sans-serif">     rd     : Rd.T;</font></div><div><font face="Calibri, sans-serif">-    cg     : M3CG.T;</font></div><div><font face="Calibri, sans-serif">+    cg     : M3CG_Ops.Public;</font></div><div><font face="Calibri, sans-serif">     ch     : CHAR;  (* current scan character *)</font></div><div><font face="Calibri, sans-serif">     buf    : InputBuffer;</font></div><div><font face="Calibri, sans-serif">     buf_len: CARDINAL;</font></div><div><font face="Calibri, sans-serif">@@ -206,7 +206,7 @@</font></div><div><font face="Calibri, sans-serif">   cmds: IntIntTbl.T := NIL;</font></div><div><font face="Calibri, sans-serif">   types: IntIntTbl.T := NIL;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE Inhale (rd: Rd.T;  cg: M3CG.T) =</font></div><div><font face="Calibri, sans-serif">+PROCEDURE Inhale (rd: Rd.T;  cg: M3CG_Ops.Public) =</font></div><div><font face="Calibri, sans-serif">   VAR s: State;  op: M3CG.Name;  cmd: INTEGER;</font></div><div><font face="Calibri, sans-serif">   BEGIN</font></div><div><font face="Calibri, sans-serif">     s.rd      := rd;</font></div><div><font face="Calibri, sans-serif">Index: M3CG_Wr.i3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Wr.i3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.1.1.1</font></div><div><font face="Calibri, sans-serif">diff -u -r1.1.1.1 M3CG_Wr.i3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Wr.i3<span style="white-space: pre;" class="ecxApple-tab-span"> </span>14 Jan 2001 13:40:37 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.1.1.1</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Wr.i3<span style="white-space: pre;" class="ecxApple-tab-span">     </span>26 Sep 2012 15:34:33 -0000</font></div><div><font face="Calibri, sans-serif">@@ -7,9 +7,9 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> INTERFACE M3CG_Wr;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-IMPORT M3CG, Wr;</font></div><div><font face="Calibri, sans-serif">+IMPORT M3CG_Ops, Wr;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE New (wr: Wr.T): M3CG.T;</font></div><div><font face="Calibri, sans-serif">+PROCEDURE New (wr: Wr.T): M3CG_Ops.Public;</font></div><div><font face="Calibri, sans-serif"> (* returns a fresh, initialized code generator that writes its</font></div><div><font face="Calibri, sans-serif">    calls as readable ASCII on 'wr'. *)</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">Index: M3CG_Wr.m3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div><div><font face="Calibri, sans-serif">RCS file: /usr/cvs/cm3/m3-sys/m3middle/src/M3CG_Wr.m3,v</font></div><div><font face="Calibri, sans-serif">retrieving revision 1.18</font></div><div><font face="Calibri, sans-serif">diff -u -r1.18 M3CG_Wr.m3</font></div><div><font face="Calibri, sans-serif">--- M3CG_Wr.m3<span style="white-space: pre;" class="ecxApple-tab-span">  </span>22 Aug 2012 14:15:40 -0000<span style="white-space: pre;" class="ecxApple-tab-span">     </span>1.18</font></div><div><font face="Calibri, sans-serif">+++ M3CG_Wr.m3<span style="white-space: pre;" class="ecxApple-tab-span">        </span>26 Sep 2012 15:34:33 -0000</font></div><div><font face="Calibri, sans-serif">@@ -27,7 +27,7 @@</font></div><div><font face="Calibri, sans-serif">   END;</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> TYPE</font></div><div><font face="Calibri, sans-serif">-  U = M3CG.T OBJECT</font></div><div><font face="Calibri, sans-serif">+  U = M3CG_Ops.Public OBJECT</font></div><div><font face="Calibri, sans-serif">         wr            : Wr.T := NIL;</font></div><div><font face="Calibri, sans-serif">         buf           : M3Buf.T := NIL;</font></div><div><font face="Calibri, sans-serif">         buf_len       : INTEGER := 0;</font></div><div><font face="Calibri, sans-serif">@@ -375,7 +375,7 @@</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> (*---------------------------------------------------------------------------*)</font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif">-PROCEDURE New (output: Wr.T): M3CG.T =</font></div><div><font face="Calibri, sans-serif">+PROCEDURE New (output: Wr.T): M3CG_Ops.Public =</font></div><div><font face="Calibri, sans-serif">   VAR mbuf := M3Buf.New ();</font></div><div><font face="Calibri, sans-serif">   BEGIN</font></div><div><font face="Calibri, sans-serif">     M3Buf.AttachDrain (mbuf, output);</font></div><div><font face="Calibri, sans-serif">Index: Target.i3</font></div><div><font face="Calibri, sans-serif">===================================================================</font></div></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"> - Jay<br><br><div><div id="ecxSkyDrivePlaceholder"></div><hr id="ecxstopSpelling">From: <a href="mailto:hosking@cs.purdue.edu"></a><a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a><br>Date: Wed, 26 Sep 2012 10:42:26 -0400<br>To: <a href="mailto:jay.krell@cornell.edu"></a><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>CC: <a href="mailto:m3devel@elegosoft.com"></a><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>Subject: Re: [M3devel] M3CG_Ops.Public vs. M3CG.T<br><br>I disagree.  M3CG.T is more abstract than M3CG_Ops.  The revelation of M3CG.T <: M3CG_Ops.Public is in M3CG_Ops.  If you want the ops you simply import that interface to get the revelation.  Please don’t make pervasive changes in interfaces that some of us are developing against.<br><br><div><div>On Sep 26, 2012, at 4:11 AM, Jay K <<a href="mailto:jay.krell@cornell.edu"></a><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>> wrote:</div><br class="ecxApple-interchange-newline"><blockquote><div style="font: 12pt/normal Calibri; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal;" class="ecxhmmessage"><div dir="ltr"><div><font face="Calibri, sans-serif">M3CG_Ops.i3:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">child: M3CG.T := NIL;</font></div><div><font face="Calibri, sans-serif">(* The default methods simply call the corresponding method in 'child',</font></div><div><font face="Calibri, sans-serif">   hence a vanilla 'M3CG.T' can be used as a filter where you override</font></div><div><font face="Calibri, sans-serif">   only the methods of interest. *)</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">1)</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">I am not keen on fixing this, but I feel this was clearly a mistake.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">M3CG_Ops.Public should have been "purely abstract" with no default</font></div><div><font face="Calibri, sans-serif">implementation.</font></div><div><font face="Calibri, sans-serif">M3CG_Filter.T or somesuch could have been as described.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">2) I am fixing:</font></div><div><font face="Calibri, sans-serif">M3CG.T is overused.</font></div><div><font face="Calibri, sans-serif">Most uses should be M3CG_Ops.Public.</font></div><div><font face="Calibri, sans-serif">It is ok to derive from -- though that was a mistake.</font></div><div><font face="Calibri, sans-serif">But functions that take or return M3CG.T should really be</font></div><div><font face="Calibri, sans-serif">taking and returning M3CG_Ops.Public.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">  - Jay</font></div></div></div></blockquote></div></div></div></div></div></blockquote></div><br></div></blockquote></div></blockquote></div><br></div>                                           </div></div>                                        </div></body>
</html>