Adds interpolation syntax to `Threads.@spawn`, to evaluate arguments immediately (#33119)
Adds $-interpolation syntax to `@async` and `Threads.@spawn`, to evaluate arguments immediately.
Add the ability to evaluate some parts of a `@spawn`/`@async`
immediately, in the current thread context.
This prevents variables being "boxed" in order to capture them in the
closure, exactly the same as wrapping them in a let-block locally.
For example, `$x` expands like this:
```julia
julia> @macroexpand @async $x + 2
quote
#= task.jl:361 =#
let var"##454" = x
#= task.jl:362 =#
local var"#9#task" = Base.Task((()->begin
#= task.jl:358 =#
var"##454" + 2
end))
#= task.jl:363 =#
if $(Expr(:islocal, Symbol("##sync#95")))
#= task.jl:364 =#
Base.push!(var"##sync#95", var"#9#task")
end
#= task.jl:366 =#
Base.schedule(var"#9#task")
#= task.jl:367 =#
var"#9#task"
end
end
```