<div dir="ltr">From what I understand of the goals of Swift, I think that any addition to runtime machinery will be hard won. The Swift runtime is deliberately small. I completely support refinement types and their logical conclusion of dependent types but I don&#39;t think that the approach of &quot;runtime checking until capable of compile time checking&quot; will gain much traction. I suggest that we work primarily on creating a syntax so that, by the time that we can implement it in the compiler, we have a truly compelling case.<div>TJ</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 16, 2016 at 6:04 PM, Matt Whiteside via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><span class=""><div><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><div><blockquote type="cite"><div><div><blockquote type="cite">On Jan 15, 2016, at 8:53 AM, Dennis Weissmann via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br><blockquote type="cite"><br>On Jan 15, 2016, at 1:56 PM, Haravikk &lt;<a href="mailto:swift-evolution@haravikk.com" target="_blank">swift-evolution@haravikk.com</a>&gt; wrote:<br><br>This is pretty interesting; while the actual compile-time type-checking could be complex and take some time to implement, it seems to me that the actual notation could be implemented in advance and simply perform runtime assertions until the real type-checking is ready? In cases where the type-checker can’t be certain of a value’s safety, a run-time assertion might make sense anyway, so this short-term behaviour could actually be left in, with the caveat being that your restriction could still fail at run-time (which is what I think most people would want when the compile-time check isn’t enough).<br><br></blockquote><br>That’s an interesting approach! I like it :)<br></blockquote></div></div></blockquote></div></div></div></div></blockquote><br></div></span><div>I agree this approach is interesting, and I’ve had similar thoughts.</div><div><br></div><div>Regarding your syntax idea,</div><span class=""><div><br></div><div><blockquote type="cite"><div style="word-wrap:break-word"><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">    typealias</span><span> RGBAInt = </span><span style="color:rgb(112,61,170)">Int</span><span> </span><span style="color:rgb(187,44,162)">where</span><span> Type &gt;= </span><span style="color:rgb(39,42,216)">0</span><span> &amp;&amp; Type &lt;= </span><span style="color:rgb(39,42,216)">255</span><span>                            </span><span style="color:rgb(0,132,0)">// Can be rewritten as a range (0...255)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">    typealias</span><span> RGBADouble = </span><span style="color:rgb(112,61,170)">Double</span><span> </span><span style="color:rgb(187,44,162)">where</span><span> Type &gt;= </span><span style="color:rgb(39,42,216)">0</span><span> &amp;&amp; Type &lt;= </span><span style="color:rgb(39,42,216)">1.0</span><span>                      </span><span style="color:rgb(0,132,0)">// Can be rewritten as a range (0...1.0)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">    typealias</span><span> BatteryLevel = </span><span style="color:rgb(112,61,170)">Int</span><span> </span><span style="color:rgb(187,44,162)">where</span><span> Type &gt;= </span><span style="color:rgb(39,42,216)">0</span><span> &amp;&amp; Type &lt;= </span><span style="color:rgb(39,42,216)">100</span><span>                       </span><span style="color:rgb(0,132,0)">// Can be rewritten as a range (0...100)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">    typealias</span><span> Primes10 = </span><span style="color:rgb(112,61,170)">Int</span><span> </span><span style="color:rgb(187,44,162)">where</span><span> Type == </span><span style="color:rgb(39,42,216)">2</span><span> || Type == </span><span style="color:rgb(39,42,216)">3</span><span> || Type == </span><span style="color:rgb(39,42,216)">5</span><span> || Type == </span><span style="color:rgb(39,42,216)">7</span><span>   </span><span style="color:rgb(0,132,0)">// Cannot be rewritten as a range</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(0,132,0)">    </span><span style="color:rgb(187,44,162)">typealias</span><span> EvenNumber = </span><span style="color:rgb(112,61,170)">Int</span><span> </span><span style="color:rgb(187,44,162)">where</span><span> Type % </span><span style="color:rgb(39,42,216)">2</span><span> == </span><span style="color:rgb(39,42,216)">0</span><span>                                    </span><span style="color:rgb(0,132,0)">// Cannot be rewritten as a range</span></div><div><span style="color:rgb(39,42,216)">  </span></div><div>What do you think?</div><div><br></div><div>- Dennis</div></div></blockquote><br></div></span><div>I was discussing something like this on another thread, about compile time execution, and this is close to the syntax that I imagined.  The only thing I might suggest is that `typealias` doesn&#39;t seem like the ideal keyword here, since that is meant to indicate that the 2 types are one and the same.  These are some options that I thought might be good:</div><div><br></div><div><div style="margin:0px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)"><span style="color:rgb(187,44,162)">struct</span><span style="color:rgb(0,0,0)"> InvertibleMatrix: </span><span style="color:rgb(112,61,170)">SquareMatrix</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(187,44,162)">where</span><span style="color:rgb(0,0,0)"> determinant() != </span><span style="color:rgb(39,42,216)">0</span><span style="color:rgb(0,0,0)"> </span></div><div style="margin:0px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)"><br></div><div style="margin:0px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)"><span style="color:rgb(187,44,162)">typedef</span><span style="color:rgb(0,0,0)"> InvertibleMatrix = </span><span style="color:rgb(112,61,170)">SquareMatrix</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(187,44,162)">where</span><span style="color:rgb(0,0,0)"> determinant() != </span><span style="color:rgb(39,42,216)">0</span><span style="color:rgb(0,0,0)"> </span></div></div><div><div style="font-family:Menlo;margin:0px;line-height:normal"><br></div><div style="font-family:Menlo;margin:0px;line-height:normal"><span style="color:rgb(187,44,162)">typerefinement</span><span> InvertibleMatrix = </span><span style="color:rgb(112,61,170)">SquareMatrix</span><span> </span><span style="color:rgb(187,44,162)">where</span><span> determinant() != </span><span style="color:rgb(39,42,216)">0</span><span> </span></div><div style="font-family:Menlo;margin:0px;line-height:normal"><span><br></span></div><div style="margin:0px;line-height:normal"><span>Matt</span></div></div><div><br></div><div><br></div><div><br></div><br></div><br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div>