<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">This email is an attempt to clarify my views on what Grace needs to allow wrt re-defining stuff from the standard libraries.<div><br></div><div>For the sake of concreteness, let's assume that my application needs an enhancement to String objects.  I might need, for example, a method</div><div>"<i>asHtml</i>" turns a String into an html object.</div><div><br></div><div>In Smalltalk,  one does this by changing the class of all of the String objects that exist in the image.  They get a new class with the extra method. This seems to be the only way to do it in Smalltalk because Smalltalk runs in a live image that is a direct descendent of some image that was running at PARC in 1980.</div><div><br></div><div>In Grace, every program starts in its own, fresh, image.  So enhancing string does <i>not</i> require changing any existing strings — it requires changing the library code to include the extra method <i>before</i> any user-program code is executed.   So the whole business of enhancing libraries can be much less dynamic.</div><div><br></div><div>In concept, the way that I see this working is that the standard prelude will include something like</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span><font face="Helvetica" style="font-size: 16px;"><b>import</b> "standardString" as string</font></div><div><br></div><div>In my enhanced prelude, I would write something like</div><div><br></div><div><font size="4" face="Helvetica"><span class="Apple-tab-span" style="white-space:pre"> </span><b>import</b> "standardString" as standardString</font></div><div><font size="4" face="Helvetica"><span class="Apple-tab-span" style="white-space:pre">        </span><b>import</b> "html" <b>as</b> html</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font size="4" face="Helvetica"> </font></span></div><div><font size="4" face="Helvetica"><span class="Apple-tab-span" style="white-space:pre">      </span><b>def</b> string is<b> </b>public  = <b>object</b> {</font></div><div><font size="4" face="Helvetica"><span class="Apple-tab-span" style="white-space:pre">                </span><b>inherits</b> string</font></div><div><font size="4" face="Helvetica"><span class="Apple-tab-span" style="white-space:pre">            </span><b>method</b> asHtml {  html.fromString(self) }</font></div><div><font size="4" face="Helvetica"><span class="Apple-tab-span" style="white-space:pre">      </span>}</font></div><div><br></div><div>For this to work, all of the Strings created by the code compiled for String Literals would need to call a constructor that's in standardString, </div><div>such as <i>string.fromNativeString()</i>.   By redefining the meaning of <i>string</i> in my program, I've made this constructor build my strings, the ones with the extra method — because all of the code generated by the compiler is (conceptually, al least) in the scope defined by my enhanced prelude.</div><div><br></div><div>No runtime object mutation is necessary.  In fact, most of this works in the language and the Minigrace implementation as currently defined, except that </div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>(1) The language spec says that we can't inherit from a module object, because it's not "fresh".  So <i>inherits string</i> has to be <i>inherits string.methods</i>, and we have to define <i>string.methods</i> in the standardString library.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>(2) in Minigrace, the interface used to create strings from literals isn't <i>string.fromNative</i>, but <i>new GraceString</i>.  And the string library isn't cleanly packaged as a module.  Neither of these seems to be important, or hard to change.</div><div><br></div><div>I'm probably missing some details of what would be required to make this work, but I don't think that the conceptual outline has changed since we discussed on 2-3 July 2012 in the conference room on the ground floor of Kim's building.  (The notes from this meeting are in the SVN repo at Notes/Grace meeting 2 July 2012.rtf).</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Andrew</div><div><br></div><div><br></div></body></html>