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