I think you mean that the value could be different each time the `let` is evaluated? In which case we're saying the same thing — it's evaluated at runtime, not compile time.
(When something like `let x = ....` appears in a proc, there isn't a single variable `x` whose value changes. Instead, each call to that proc creates a _new_ local variable `x` with a single immutable value, and `x` disappears when the proc exits. It's called "lexical scoping". This may not seem like a big distinction, but it is. Some early languages like LISP 1.x did things the way you describe, but it turns out to cause a lot of problems with recursive functions, closures, etc.)