The scope trick won&#39;t work. You can&#39;t modify a const after the declaration.<br><br><div class="gmail_quote">On Wed, Aug 11, 2010 at 7:26 PM, Jonathan M Davis <span dir="ltr">&lt;<a href="mailto:jmdavisprog@gmail.com">jmdavisprog@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><div></div><div class="h5">On Wednesday, August 11, 2010 08:59:29 bearophile wrote:<br>

&gt; This is an little idiom that is getting common in my code, it&#39;s similar to<br>
&gt; the &#39;transients&#39; of Clojure language.<br>
&gt;<br>
&gt; Often I have to build a simple data structure like an array associative or<br>
&gt; another kind of array, it needs to be mutable because I fill it in few<br>
&gt; lines of code code. When it&#39;s complete I never need to change it again, so<br>
&gt; now I&#39;d like it to be const. I can&#39;t freeze it, so I have to create a new<br>
&gt; variable:<br>
&gt;<br>
&gt;<br>
&gt; void main() {<br>
&gt;     int[int] aa_;<br>
&gt;     foreach (i; 0 .. 10)<br>
&gt;         aa_[i] = i * i;<br>
&gt;<br>
&gt;     // now I&#39;d like to freeze aa<br>
&gt;     const(int[int]) aa = aa_;<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; If the array is fixed-sized the situation is worse because the last line<br>
&gt; copies the whole array.<br>
&gt;<br>
&gt; Sometimes I use a small function to do this.<br>
&gt;<br>
&gt; This is an alternative way to write it that I&#39;ve never used because I don&#39;t<br>
&gt; like it much:<br>
&gt;<br>
&gt; void main() {<br>
&gt;     const(int[int]) aa = {<br>
&gt;         int[int] result;<br>
&gt;         foreach (i; 0 .. 10)<br>
&gt;             result[i] = i * i;<br>
&gt;         return result;<br>
&gt;     }();<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; In Python I sometimes use &quot;delete&quot; to remove a name from the local<br>
&gt; namespace that I don&#39;t want to use any more. This cleaning purpose may be<br>
&gt; a replacement purpose for the delete keyword, but I don&#39;t know if you like<br>
&gt; it:<br>
&gt;<br>
&gt;<br>
&gt; void main() {<br>
&gt;     int[int] aa_;<br>
&gt;     foreach (i; 0 .. 10)<br>
&gt;         aa_[i] = i * i;<br>
&gt;<br>
&gt;     // now I&#39;d like to freeze aa<br>
&gt;     const(int[int]) aa = aa_;<br>
&gt;     delete aa_; // from now on the &#39;aa_&#39; name can&#39;t be seen/used.<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; Here delete doesn&#39;t clean the aa_, it just removes the aa_ name from the<br>
&gt; local namespace. If there&#39;s another reference to aa_ it is unchanged and<br>
&gt; it sees an unchanged associative array. The point of removing the aa_ name<br>
&gt; is to keep the namespace tidy.<br>
&gt;<br>
&gt; As with variable definitions a goto can&#39;t jump over one delete. In Python<br>
&gt; you can later create a new variable with the same name, but in D the<br>
&gt; variable doesn&#39;t actually vanish from the stack, so I think it&#39;s better to<br>
&gt; disallow successive redefinitions of it.<br>
&gt;<br>
&gt; Bye,<br>
&gt; bearophile<br>
<br>
</div></div>I think that&#39;s a total no-go because it would depend on program flow. You&#39;re<br>
trying to alter a compile-time property at runtime. All it takes is having<br>
delete within an if statement, and all of a sudden, depending on how your<br>
program runs, the name may or may not be visible. You kind hide the variable<br>
creation inside another scope if you want this sort of behavior:<br>
<div class="im"><br>
void main()<br>
{<br>
    const(int[int]) aa;<br>
<br>
    {<br>
</div><div class="im">        int[int] aa_;<br>
        foreach(i; 0 .. 10)<br>
            aa_[i] = i * i;<br>
</div>        aa = aa_;<br>
    }<br>
}<br>
<br>
<br>
That naturally removes the name from the namespace just fine. It&#39;s possible that<br>
this particular idiom calls for some sort of language addition or having<br>
something added to Phobos, but removing symbols from a namespace with statements<br>
is not going to work very well - if at all - in a compiled, statically-typed<br>
language like D.<br>
<font color="#888888"><br>
- Jonathan M Davis<br>
</font></blockquote></div><br>