<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">I’ve just added this page to the Wiki at <a href="https://projects.cecs.pdx.edu:8443/~black/NewOOL/index.cgi/wiki/CompareWithJava">https://projects.cecs.pdx.edu:8443/~black/NewOOL/index.cgi/wiki/CompareWithJava</a>.  Please make corrections there, and also discuss there that discussion that is better conducted in-line.<div><br></div><div><h1 id="HowDoesGraceComparewithJava" style="font-family: Arial, Verdana, 'Bitstream Vera Sans', Helvetica, sans-serif; letter-spacing: -0.018em; page-break-after: avoid; font-size: 19px; margin: 0.15em 1em 0.5em -18px;">  <span style="letter-spacing: -0.018em;">How Does Grace Compare with Java?</span></h1><h1 id="HowDoesGraceComparewithJava" style="font-family: Arial, Verdana, 'Bitstream Vera Sans', Helvetica, sans-serif; letter-spacing: -0.018em; page-break-after: avoid; font-size: 19px; margin: 0.15em 1em 0.5em -18px;"><a class="anchor" href="https://projects.cecs.pdx.edu:8443/~black/NewOOL/index.cgi/wiki/CompareWithJava#HowDoesGraceComparewithJava" title="Link to this section" style="text-decoration: none; color: rgb(215, 215, 215); border: none; font-size: 0.8em; vertical-align: text-top; visibility: hidden;"></a></h1><p style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;">In an email on 10 December 2014, Marco Servetto wrote:</p><blockquote class="citation" style="margin: -0.6em 0px; border-style: solid; border-width: 0px 0px 0px 2px; padding-left: 0.5em; border-color: rgb(187, 68, 68); font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;"><p>For the best of my understanding, the only really complex point in the programming language design space that Grace do not have, but all of Java/C#/C++ do have, is type-based method overloading.</p><p>Oh, yes, and there is only one supported numeric type, so no need for conversion/coercions here</p></blockquote><p style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;">This didn't seem right to me; surely Grace is a lot simpler than Java (and certainly than C# and C++, although I know those languages a lot less well). Here is my list of Java features that Grace does not have, motivated by Kim Bruce's <em><a class="missing wiki" href="https://projects.cecs.pdx.edu:8443/~black/NewOOL/index.cgi/wiki/GraceToJava" rel="nofollow" style="text-decoration: none; color: rgb(153, 153, 136); border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: rgb(187, 187, 187);">GraceToJava?</a></em> document, prepared for his students.</p><ol style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;"><li>Type-based overloading.</li><li>Arity-based overloading.</li><li>Primitive data — int, boolean, char, byte, short, long, float, double.</li><li>Classes (as built-in non-objects).</li><li>Packages (as built-in non-objects).</li><li>Constructors (as distinct from methods) and <strong>new</strong>.</li><li>Object initializers ( code in a class enclosed in { and } )</li><li><strong>import</strong> * — introduction of names invisibly.</li><li>Operations on <em>variables</em>, like <tt>x++</tt> meaning <tt>x := x + 1</tt>.</li><li>Multiple numeric types (so that, for example, 3.0 and 3 are different).</li><li>Numeric literals with <tt>F</tt> and <tt>L</tt>.</li><li>Integer arithmetic defined to wrap.</li><li><tt>==</tt> as a built-in operation on objects.</li><li><strong>static</strong> variables.</li><li><strong>static</strong> methods.</li><li><strong>static</strong> initializers.</li><li><strong>final</strong>.</li><li><strong>private</strong> (which is much more complicated than most people realize, since it interacts with the type system).</li><li>C-style <strong>for</strong> loops.</li><li><strong>switch</strong> statements.</li><li>Class-types.</li><li>Packages</li><li>Package-based visibility.</li><li>Arrays (as a special built-in construct with their own special syntax and type rules).</li><li>Required semicolons.</li><li><tt>()</tt> in method requests that take no parameters.</li><li><tt>public static void main(String[] args)</tt> necessary to run your code.</li><li>Object with "functional interfaces" treated as λ-expressions.</li></ol><p style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;">Of course, there are a few things that Grace has that are not in Java. We should be careful to justify all of these things; the typical justification is that they remove more complexity from most programs than they add to the Grace language definition.</p><ol style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;"><li>String interpolations:  <tt>"the value of x is {x}."</tt> rather than <tt>"the value of x is " + x.toString + "."</tt>.</li><li>Class syntax as a way of defining objects.</li><li>Factory method syntax as a way of defining methods.</li><li>Implicit declaration of variables in patterns. (I'm not counting patters themselves as these could be considered just a library. But implicit declaration of variables in Patterns is a language feature, and one that I find mind-bendingly complex).</li><li>Blocks usable as patterns (as well as functions).</li><li>Inheritance from "fresh" objects and the special semantics of method requests after <strong>inherits</strong>.</li></ol><p style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;">There are also a few things that are just <em>different</em> in Grace and Java. I think that all of these differences are well-motivated.</p><ol style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;"><li>Operators are method, not built-in features.</li><li>Control structures are methods, not built-in features.</li><li>Method visibility is based on objects, not on files, or packages or classes.</li><li>Types correspond to Java interfaces</li><li>Type conformance depends on an object's methods, not on the class from which it was created.</li><li>Type annotations are optional.</li><li>Blocks define λ-expressions (rather than using a special syntax).</li></ol><p style="font-family: Verdana, Arial, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 13px;">Can we complete these lists? I think that they will be useful in describing and "selling" grace to our colleagues.</p></div></body></html>