<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;">I started looking at Kim’s version of collections with types, and found something that I don’t know how to express.<div><br></div><div><br></div><div>In my (untyped) version, I had defined a list object, which was a CollectionFactory with methods with(), withAll(), and empty.</div><div><br></div><div>Kim wanted to parameterise this object,making it a list<T>.  Well, we can’t do that, because we can’t parameters defs, only methods.</div><div><br></div><div>Kim worked around this problem by adding an extra level of method:</div><div><br></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">  </span>def list = object {</span></font></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">      </span>    method ofType<T> { </span></font></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">                </span>object {</span></font></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">         </span>    </span></font><span style="font-family: Menlo; font-size: 11px;">method withAll(</span><span style="font-family: Menlo; font-size: 11px;">a:Collection<T>) -> ListT<T> {</span></div><div><span class="Apple-tab-span" style="font-size: 11px; font-family: Menlo; white-space: pre;">                             </span><span style="font-size: 11px; font-family: Menlo;">…</span></div><div><span style="font-size: 11px; font-family: Menlo;"><span class="Apple-tab-span" style="white-space:pre">         </span>    }</span></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">          </span>}</span></font></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">        </span>    }</span></font></div><div><font face="Menlo"><span style="font-size: 11px;"><span class="Apple-tab-span" style="white-space:pre">     </span>}</span></font></div><div><br></div><div>except that he used the dotted class syntax.   Unfortunately, this changes the interface of every factory method.  So when I tried to run a test that constructed</div><div><br></div><div><font face="Menlo" style="font-size: 11px;">    def oneToFive = list.with(1, 2, 3, 4, 5)</font></div><div><br></div><div>the test failed because list no longer has a <b>with</b> method.</div><div><br></div><div>Maybe this is OK; maybe we <i>want</i> to make the typed and untyped interfaces quite different.   But I don’t think so; I thought that the only differences between the typed and the untyped programs was going to be the presence of types.</div><div><br></div><div>So, instead, I moved the type parameters to the factory methods:</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">  </span><span style="font-family: Menlo; font-size: 11px;">def list:CollectionFactory is readable = object {</span></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">    inherits collectionFactory.trait</div><div style="margin: 0px; font-size: 11px; font-family: Menlo; min-height: 13px;"><br></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">    method withAll<T>(a:Collection<T>) -> ListT<T> {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">        object {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            inherits enumerable.trait</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            var inner: PArray<T> := PrimitiveArray.new(a.size * 2 + 1)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            var size:Number is readable := 0</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            for (a: ListT<T>) do {x: T -></div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">                <a href="http://inner.at">inner.at</a>(size)put(x)</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">                size := size + 1</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            }</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            method boundsCheck(n: Number) is confidential {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">                if ((n < 1) || (n > size)) then {</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">                    boundsError.raise "index {n} out of bounds 1..{size}" </div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">                }</div><div style="margin: 0px; font-size: 11px; font-family: Menlo;">            }</div><div><br></div><div>So now one can declare</div><div><br></div><div><span style="font-family: Menlo; font-size: 11px;">    def oneToFive = list.with<Number>(1, 2, 3, 4, 5)</span></div><div><span style="font-family: Menlo; font-size: 11px;"><br></span></div><div>Previously, I argued for getting rid of type parameters as a special case and just using ordinary method parameters.  In this case, the typed and untyped interfaces will indeed be different — but the language simpler.   If we keep the extra compel city of type parameters, I want a payoff — the payoff being, in this case, that typed and untyped programs differ only in the presence of their types.</div><div><br></div><div>Comments?</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">      </span>Andrew</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">      </span></div></body></html>