Benefits of deliberately freezing variables?


#1

Is there any benefit in explicitly freezing variables? As a simple example, see the following snippets:

http://is.gd/S7kZo7
http://is.gd/m04mHJ

The variable x is initialized and then used to compute something else. In one, x is mutable throughout the program. In the other, x is frozen after it’s initialized.

The LLVM appears to be slightly different, which makes me believe there might be some benefit for more complex programs. However, I’m no LLVM expert.

Of course, there are obvious benefits about conveying the developer’s intent and using the type system to prevent bugs. On the other hand, there’s also more complexity in this pattern, particularly if we’re doing this for several bindings in the same block. I’m wondering if there’s a performance benefit–now or in the future–that might make this definitely worth it.


#2

I don’t know about any actual runtime benefit from this - there may be one, but I wouldn’t be sure.

For style, if you are going to re-initialize it as immutable, I would use a new scope:

fn main() {
    let x = {
        let mut x = 10;

        for _ in 0..100 {
            x += x * 3 + 1;
            x -= x * 2 + 2;
        }

        x
    };

    let mut s = 1;

    for _ in 0..100 {
        s += s*x + 1;
    }

    println!("{}", s);
}

This is pretty much equivalent to your second example - I would definitely chose this over let x = x;, but I’m not sure whether making it immutable would be preferred over your first link.


#3

Also, thought about a macro here, something like:

macro_rules! freeze {
  ($($name:ident),+) => {
    $(let $name = $name;)*
  }
}

Which will make for nice looking:

freeze!(x);