<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div>That's a great choice ;-) — if I had the time, this would be the Swift-feature I'd spend it for…</div><div>I hope you have the stamina to finish that, and although it's no real help for implementation, I have some remarks that might be useful in the long run.</div><div><br class=""></div><div>There are already some thoughts on the topic online (afair even core had something to say about it — I can try to find it if you didn't do so already ;-).</div><div>Your Vector example illustrates one problem: "T: X" can now have two different meanings; either T is a subtype of X, or T is a literal of type X.</div><div>Even if the compiler can figure out what meaning to chose, it would help humans to have a slightly different syntax.</div><div><br class=""></div><div>There's also the idea of labeled generic parameters, and default values for them.</div><div>Both aren't required, but imho at least the labels might be something that people request before another kind of generics is accepted.</div><div><br class=""><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(127, 135, 207); background-color: rgb(0, 57, 70);" class=""><span style="color: #de5194" class="">struct</span><span style="color: #a4b0b1" class=""> Vector&lt;T: </span>ExpressibleByIntegerLiteral<span style="color: #a4b0b1" class="">, L: </span>IntegerLiteralExpr<span style="color: #a4b0b1" class="">&gt; {</span></div><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(164, 176, 177); background-color: rgb(0, 57, 70);" class="">&nbsp; <span style="color: #de5194" class="">var</span> elements: [<span style="color: #7f87cf" class="">T</span>]</div><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(164, 176, 177); background-color: rgb(0, 57, 70);" class="">&nbsp; <span style="color: #de5194" class="">init</span>() {</div><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; background-color: rgb(0, 57, 70);" class=""><span style="color: rgb(164, 176, 177);" class="">&nbsp; &nbsp; <span style="color: #2fafa9" class="">elements</span> = [<span style="color: #7f87cf" class="">T</span>](repeating: <span style="color: #e5493d" class="">0</span>, count: </span><font color="#7f87cf" class="">L</font><font color="#a4b0b1" class="">)</font></div><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(164, 176, 177); background-color: rgb(0, 57, 70);" class="">&nbsp; }</div><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(164, 176, 177); background-color: rgb(0, 57, 70);" class="">}</div><div style="margin: 0px; line-height: normal; background-color: rgb(0, 57, 70); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(164, 176, 177); background-color: rgb(0, 57, 70);" class=""><span style="color: #de5194" class="">let</span> vect = <span style="color: #7f87cf" class="">Vector</span><span style="text-decoration: underline" class="">&lt;</span><span style="color: #7f87cf" class="">Int</span>, <span style="text-decoration: underline ; color: #e5493d" class="">5</span>&gt;()</div></div></div></blockquote><div>I have strong hope that literal generics will form the basis for fixed-size vectors, so that there will be no need to define such a type ;-) — but besides that:</div><div>Why is T restricted here? Even if it should be a numeric type, I would allow floats as well.</div><br class=""><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">And, once that's working, I'm going to add support simple "type functions":</div><div class=""><div style="margin: 0px; font-size: 18px; line-height: normal; font-family: 'Fantasque Sans Mono'; color: rgb(164, 176, 177); background-color: rgb(0, 57, 70);" class=""><span style="color: #de5194" class="">func</span> join &lt;T, L1, L2&gt; (<span style="color: #de5194" class="">_</span> lhs: <span style="color: #7f87cf" class="">Vector</span>&lt;<span style="color: #7f87cf" class="">T</span>, <span style="color: #7f87cf" class="">L1</span>&gt;, <span style="color: #de5194" class="">_</span> rhs: <span style="color: #7f87cf" class="">Vector</span>&lt;<span style="color: #7f87cf" class="">T</span>, <span style="color: #7f87cf" class="">L2</span>&gt;) -&gt;&nbsp;<span style="color: rgb(127, 135, 207);" class="">Vector</span>&lt;<span style="color: rgb(127, 135, 207);" class="">T</span>,&nbsp;<span style="color: rgb(127, 135, 207);" class="">L1</span>&nbsp;+&nbsp;<span style="color: rgb(127, 135, 207);" class="">L2</span>&nbsp;&gt; {...}</div></div><div class="">I think restricting the supported "type functions" to expressions that could be evaluated by the compiler's "constant folding" code would be a reasonable place to start, until we figure out what we want to do about "pure"/"constexpr" stuff... even just "+" for numeric and string literals, and "-" for numeric literals, seems like a reasonable starting goal, and I <i class="">think</i>&nbsp;that'd be simple enough to implement (famous last words, right?)... It's all academic until I get the simple cases working first, though.</div></div></blockquote>Even without such calculations, the feature would be quite useful:</div><div>For type-safe matrices, it would already be enough to have the dimensions attached to the type.</div></body></html>