https://wiki.dlang.org/?title=DIP84&feed=atom&action=history
DIP84 - Revision history
2024-03-29T08:04:43Z
Revision history for this page on the wiki
MediaWiki 1.31.2
https://wiki.dlang.org/?title=DIP84&diff=9044&oldid=prev
D user: Category:DIP
2018-03-04T05:07:18Z
<p><a href="/Category:DIP" title="Category:DIP">Category:DIP</a></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Revision as of 05:07, 4 March 2018</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l218" >Line 218:</td>
<td colspan="2" class="diff-lineno">Line 218:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Instead of relying on compilation errors from the code copied from the lambda, it should be possible to generate even better</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>Instead of relying on compilation errors from the code copied from the lambda, it should be possible to generate even better</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>compiler errors for well-known types from the standard library.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>compiler errors for well-known types from the standard library.</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[[Category:DIP]]</ins></div></td></tr>
</table>
D user
https://wiki.dlang.org/?title=DIP84&diff=7505&oldid=prev
Atilaneves: /* Implementation */
2016-05-09T20:03:52Z
<p><span dir="auto"><span class="autocomment">Implementation</span></span></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Revision as of 20:03, 9 May 2016</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l124" >Line 124:</td>
<td colspan="2" class="diff-lineno">Line 124:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>   //added by the compiler:</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>   //added by the compiler:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>   static if(!Predicate(Struct))</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>   static if(!Predicate<ins class="diffchange diffchange-inline">!</ins>(Struct))</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>   {</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>   {</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>       auto failFunc(/* same args as lambda*/)</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>       auto failFunc(/* same args as lambda*/)</div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l148" >Line 148:</td>
<td colspan="2" class="diff-lineno">Line 148:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>struct Struct</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>struct Struct</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>   static if(!Predicate(Struct, T))</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>   static if(!Predicate<ins class="diffchange diffchange-inline">!</ins>(Struct, T))</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>   {</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>   {</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>       auto failFunc(/* same args as lambda*/)</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>       auto failFunc(/* same args as lambda*/)</div></td></tr>
</table>
Atilaneves
https://wiki.dlang.org/?title=DIP84&diff=6947&oldid=prev
Atilaneves: /* Implementation */
2015-11-10T10:45:05Z
<p><span dir="auto"><span class="autocomment">Implementation</span></span></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Revision as of 10:45, 10 November 2015</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l160" >Line 160:</td>
<td colspan="2" class="diff-lineno">Line 160:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>It would be best to change the line numbers reported in the resulting error messages to be changed to the line where the static inheritance is declared.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>It would be best to change the line numbers reported in the resulting error messages to be changed to the line where the static inheritance is declared.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">Alternatively, a new compiler trait __traits(compilesNoSuppress) could be used. It would work the same way as __traits(compiles) but would print out error messages when compilation failed. In that case, the first example would be lowered to:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"><syntaxhighlight lang=D></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">static assert(__traits(compilesNoSupress, isInputRange!Struct));</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">struct Struct</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">    //as before</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">}</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></syntaxhighlight></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">This has the immediate advantage of not requiring any line number changes.</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Examples of lowering ==</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Examples of lowering ==</div></td></tr>
</table>
Atilaneves
https://wiki.dlang.org/?title=DIP84&diff=6895&oldid=prev
Atilaneves at 14:32, 30 October 2015
2015-10-30T14:32:20Z
<p></p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Revision as of 14:32, 30 October 2015</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l56" >Line 56:</td>
<td colspan="2" class="diff-lineno">Line 56:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></syntaxhighlight></div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></syntaxhighlight></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>yields a compiler error message indicating that <code>void foo() is not implemented</code>. Similarly, it is not possible to instantiate a class with unimplemented without getting <del class="diffchange diffchange-inline">a similar </del>error.</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>yields a compiler error message indicating that <code>void foo() is not implemented</code>. Similarly, it is not possible to instantiate a class with unimplemented <ins class="diffchange diffchange-inline">abstract functions </ins>without getting <ins class="diffchange diffchange-inline">an equivalent </ins>error.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>This DIP attempts to make static polymorphism as easy to adhere to as the more well-known and established runtime variety. This is particularly important for D due to the emphasis on the former with respect to other languages.</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>This DIP attempts to make static polymorphism as easy to adhere to as the more well-known and established runtime variety. This is particularly important for D due to the emphasis on the former with respect to other languages.</div></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l170" >Line 170:</td>
<td colspan="2" class="diff-lineno">Line 170:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>struct In</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>struct In</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>{</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>     static if(!isInputRange!(<del class="diffchange diffchange-inline">Zeroes</del>))</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>     static if(!isInputRange!(<ins class="diffchange diffchange-inline">In</ins>))</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>     {</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>     {</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>         auto failFunc(inout int = 0)</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>         auto failFunc(inout int = 0)</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>         {</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>         {</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>             <del class="diffchange diffchange-inline">Zeroes </del>r = <del class="diffchange diffchange-inline">Zeroes</del>.init;</div></td><td class='diff-marker'>+</td><td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>             <ins class="diffchange diffchange-inline">In </ins>r = <ins class="diffchange diffchange-inline">In</ins>.init;</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>             if (r.empty) {}</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>             if (r.empty) {}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>             r.popFront();</div></td><td class='diff-marker'> </td><td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>             r.popFront();</div></td></tr>
</table>
Atilaneves
https://wiki.dlang.org/?title=DIP84&diff=6894&oldid=prev
Atilaneves: Created page with "== DIP84: Static Inheritance == {| class="wikitable" !Title: !''Static Inheritance'' |- |DIP: |84 |- |Version: |1 |- |Status: |Draft |- |Created: |2015-10-30 |- |Last Modifie..."
2015-10-30T14:28:46Z
<p>Created page with "== DIP84: Static Inheritance == {| class="wikitable" !Title: !''Static Inheritance'' |- |DIP: |84 |- |Version: |1 |- |Status: |Draft |- |Created: |2015-10-30 |- |Last Modifie..."</p>
<p><b>New page</b></p><div>== DIP84: Static Inheritance ==<br />
<br />
{| class="wikitable"<br />
!Title:<br />
!''Static Inheritance''<br />
|-<br />
|DIP:<br />
|84<br />
|-<br />
|Version:<br />
|1<br />
|-<br />
|Status:<br />
|Draft<br />
|-<br />
|Created:<br />
|2015-10-30<br />
|-<br />
|Last Modified:<br />
|{{REVISIONYEAR}}-{{REVISIONMONTH}}-{{REVISIONDAY}}<br />
|-<br />
|Author:<br />
|Atila Neves<br />
|}<br />
<br />
== Abstract ==<br />
<br />
Express intent to the compiler that a user-defined type conforms to a static interface.<br />
<br />
<br />
== Rationale ==<br />
<br />
Currently, D uses template constraints as a means of restricting the types a template function/struct/class can be instantiated with. Common examples are <code>isInputRange!R</code> and <code>isOutputRange!(R, E)</code>. It is also common to statically assert that a user-defined type satisfies the template constraint predicate:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct<br />
{<br />
//...<br />
static assert(isInputRange!Struct);<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
While this works, when the static assertion fails there is no help from the compiler to guide the developer to fix the error. This is in stark constrast to runtime polymorphism, where:<br />
<br />
<syntaxhighlight lang=D><br />
interface Interface<br />
{<br />
void foo();<br />
}<br />
<br />
class Class : Interface<br />
{<br />
//... no foo here<br />
}<br />
</syntaxhighlight><br />
<br />
yields a compiler error message indicating that <code>void foo() is not implemented</code>. Similarly, it is not possible to instantiate a class with unimplemented without getting a similar error.<br />
<br />
This DIP attempts to make static polymorphism as easy to adhere to as the more well-known and established runtime variety. This is particularly important for D due to the emphasis on the former with respect to other languages.<br />
<br />
== Description ==<br />
<br />
This DIP proposes a backwards-compatible change to the language so that it becomes possible for classes and structs to "inherit" from a template constraint predicate. Since classes can already inherit from interfaces and one class, the <code>static</code> keyword would be added to distinguish:<br />
<br />
<syntaxhighlight lang=D><br />
class Class : static isInputRange<br />
{<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Structs can't currently inherit and so wouldn't need <code>static</code>. However, it might be preferable to require it anyway for parity with classes:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct : isInputRange // or struct Struct : static isInputRange<br />
{<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Static inheritance would only be syntatically valid if the right-hand side of the colon is equivalent to a template of the form:<br />
<br />
<syntaxhighlight lang=D><br />
template Predicate(T) {<br />
enum Predicate = is(typeof(() { /*code*/ }));<br />
}<br />
</syntaxhighlight><br />
<br />
The enclosed lambda would be allowed to have default arguments. Since templates must be visible, the compiler would have access to the code block inside the lambda. This is essential for the diagnostics.<br />
<br />
In the case of multiple template arguments for the predicate, as is the case for <code>isOutputRange</code>, all but the first would be omitted for the static inheritance:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct: isOutputRange!(int)<br />
{<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
And the predicate must have N + 1 arguments:<br />
<br />
<syntaxhighlight lang=D><br />
enum Predicate(T, U) { /*...*/ }<br />
</syntaxhighlight><br />
<br />
== Implementation ==<br />
<br />
Assuming that the static inheritance is syntatically valid as described above, the compiler would lower the struct/class definition from:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct: Predicate<br />
{<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
to:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct<br />
{<br />
//as before<br />
<br />
//added by the compiler:<br />
static if(!Predicate(Struct))<br />
{<br />
auto failFunc(/* same args as lambda*/)<br />
{<br />
//insert code inside the lambda, substituting the types accordingly<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
In case the predicate has more than one template argument, it would go from:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct : Predicate!(T...)<br />
{<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
to:<br />
<br />
<syntaxhighlight lang=D><br />
struct Struct<br />
{<br />
static if(!Predicate(Struct, T))<br />
{<br />
auto failFunc(/* same args as lambda*/)<br />
{<br />
//insert code inside the lambda, substituting the types accordingly<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
It would be best to change the line numbers reported in the resulting error messages to be changed to the line where the static inheritance is declared.<br />
<br />
<br />
== Examples of lowering ==<br />
<br />
For <code>isInputRange</code>, the original definition is shown followed by the lowering:<br />
<br />
<syntaxhighlight lang=D><br />
struct In: isInputRange { }<br />
<br />
struct In<br />
{<br />
static if(!isInputRange!(Zeroes))<br />
{<br />
auto failFunc(inout int = 0)<br />
{<br />
Zeroes r = Zeroes.init;<br />
if (r.empty) {}<br />
r.popFront();<br />
auto h = r.front;<br />
};<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
For <code>isOutputRange</code>:<br />
<br />
<syntaxhighlight lang=D><br />
struct Out: isOuputRange!int { }<br />
<br />
struct Out<br />
{<br />
static if(!isOutputRange!(Out, int))<br />
{<br />
auto failFunc(inout int = 0)<br />
{<br />
Out r = Out.init;<br />
int e = int.init;<br />
put(r, e);<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
== Improvements ==<br />
<br />
Instead of relying on compilation errors from the code copied from the lambda, it should be possible to generate even better<br />
compiler errors for well-known types from the standard library.</div>
Atilaneves