How do you drop one quote inside another?

In the following pseudocode, is it possible to drop the foo quote inside the fizzbuzz function?

bar = quote
  foo = quote
    i = rand()
    j = 7
  end

  function fizzbuzz()
    # want foo here
    k = i * j
  end
end


For clarity, the following works with foo defined outside the bar quote:

foo = quote
  i = rand()
  j = 7
end

bar = quote
  function fizzbuzz()
    $(foo)
    k = i * j
  end
end
bar = quote
    foo = quote
        i = rand()
        j = 7
    end
    function fizzbuzz()
        eval($foo)
        k = i*j
    end
end

eval won’t work because it operates on a module scope (i.e. it won’t have access to function variables)

Another try:

This also avoids foo to be expanded too early. But bar now does not express the function fizzbuzz, but yet another expression, so maybe this won’t work for you either. (Actually, it is more or less the same as the working version that you wrote initially, but wrapped into another expression.)

bar = quote
    foo = quote
        i = rand()
        j = 7
    end
    
    quote
        function fizzbuzz()
            $foo;
            k = i*j
        end
    end
end
1 Like

Solid effort, but the real answer I guess was that you have to flip the problem on its head?

The way I got around this situation is copying the work of InteractNext.jl