On Thu, Jan 22, 2026 at 10:17 AM Tim Düsterhus <[email protected]> wrote:
>
> Hi
>
> we just opened the vote on the “let construct (Block Scoping)” RFC
> (which was originally proposed as “use construct”, but the keyword
> changed as a result of the discussion).

Hi,

Thank you for your work on this.

I voted no because the RFC is presented as a way to dispose of
resources immediately (quoting: "This feature provides immense value,
particularly for modern applications built on long-lived servers,
where disciplined and immediate resource cleanup is not just a best
practice, but a necessity for stability and performance."), yet it
doesn't in practice as it relies on reference counting as a proxy for
cleaning up at block exit.

While reference counting is deterministic, ensuring that a value is
uniquely referenced before leaving a block is impossible, and cannot
be enforced by the block itself. In practice, useful code will send
the resource to other functions or 3rd party code that may retain a
reference to it. Moreover, there are many non-obvious ways in which a
reference count can be increased or a value’s lifetime extended:
exceptions or backtraces may capture arguments, fibers, generators, or
closures with non obvious lifetimes retain their local variables,
closures tend to create cycles, foreach variables are not always
unset, etc.

Therefore there is a non-zero possibility that a let() statement will
not in fact cleanup the resource, despite the stated goal. Fixing this
later would be a BC break as people may rely on this behavior.

The RFC refers to similar constructs from other languages, but none of
them rely on reference counting for this purpose. I'm not aware of
languages relying on reference counting for this.

Best Regards,
Arnaud

Reply via email to