# World age delay doesn't occur with \`@eval\` in \`begin\` or \`let\` blocks, but does with \`eval\`

**URL:** <https://discourse.julialang.org/t/world-age-delay-doesnt-occur-with-eval-in-begin-or-let-blocks-but-does-with-eval/134367>\
**Category:** General Usage\
**Tags:** world\_age\
**Created:** [December 4, 2025, 11:56pm UTC](https://discourse.julialang.org/t/world-age-delay-doesnt-occur-with-eval-in-begin-or-let-blocks-but-does-with-eval/134367 "2025-12-04T23:56:13Z")\
**Posts on this page:** 1\
**Showing post:** 7

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [December 5, 2025, 9:58am UTC](https://discourse.julialang.org/t/world-age-delay-doesnt-occur-with-eval-in-begin-or-let-blocks-but-does-with-eval/134367/7 "2025-12-05T09:58:29Z")

</div>

> [@Keno](#):
>
> 1.11 did not have world-age partitioning for bindings, the code in your original post is UB in these versions. However, it’s not entirely related since 1.11 raised world ages after most statements anyway (but was inconsistent about when).

True, I suppose I’d have to do the zero-argument function call as a pseudo-constant:

```julia-auto
julia> pip() = 3 # 1.11
pip (generic function with 1 method)

julia> begin
       println(pip())
       @eval pip() = 3.1
       println(pip()) # updated
       end;
3
3.1

julia> begin
       println(pip())
       eval(:(pip() = 3.14))
       println(pip()) # updated
       end;
3.1
3.14

```

which I really hope is just long-unclarified undefined behavior if that can’t happen in 1.12.

> [@Keno](#):
>
> I was just trying to be nice to the ecosystem. It was less breaking this way…Also, hey - I’m proud of myself for actually having documented this :).

I’m pretty grateful that it’s finally moving because the Manual has been ambiguous about MANY fundamentals like this to make room for future core features (at least, I think most people have been surprised that constants weren’t part of world age until now, especially given the zero-argument function workaround). While these don’t seem to cause widespread issues, people _have_ noticed odd implementation inconsistencies, like the difference between [importing a `function` versus a `struct`](https://discourse.julialang.org/t/understanding-behavior-of-function-extension-in-1-12/133451), that end up being specified. I think Julia is just going to have to be a little weird until the core features and specification are solid enough to even begin considering a more straightforward v2. I personally would love if explicit-only variable declarations (and thus much simpler conditions for assignment) in v2 could finally let us freely paste code between the global and local scopes and do away with soft scope contexts, and world age bindings would probably be important there.

---

_[View the full topic](https://discourse.julialang.org/t/world-age-delay-doesnt-occur-with-eval-in-begin-or-let-blocks-but-does-with-eval/134367)._
