Const Variables
H. S. Teoh
hsteoh at quickfur.ath.cx
Mon Apr 4 20:37:27 UTC 2022
On Mon, Apr 04, 2022 at 11:20:31AM -0700, Ali Çehreli via Digitalmars-d-learn wrote:
> On 4/3/22 17:42, H. S. Teoh wrote:
>
> > In some sense, this is like an extension of ctors initializing
> > immutable values. The compiler tracks whether the variable has been
> > initialized yet, and inside the ctor you can assign to immutable
> > because the uninitialized value is not observable from outside
> > before that. Once assigned, the compiler enforces no subsequent
> > changes.
>
> These ideas make sense to me.
>
> I remember reading somewhat similar requests in the past: Assign to a
> variable freely but at some point say "no more mutation to this
> variable".
[...]
It's not just "assign freely"; it's "assign once". Or rather, "assign
before the outside world sees it".
In fact, now that I think of it, I wonder if this could actually be
implementable in the current language. Here's a first stab at it:
struct LazyValue(T) {
private class Impl
{
immutable T value;
this(immutable T v) { value = v; }
}
private Impl impl;
private T delegate() pure generate;
this(T delegate() pure _generate)
{
generate = _generate;
}
immutable(T) get() {
if (impl is null)
impl = new Impl(generate());
return impl.value;
}
alias get this;
}
void main() {
import std;
auto lazyInt = LazyValue!int({ return 123; });
writeln(lazyInt.get);
}
Currently generate() has to be pure, which limits the utility somewhat
(you couldn't load the value from a file, say). But in principle, the
approach seems to work.
T
--
Obviously, some things aren't very obvious.
More information about the Digitalmars-d-learn
mailing list