S = State() function mk(x) return function (y) return x * y end end f = mk(20) S:eval([[ g, x = ... print("x", x) print(g(10)) ]], f, 10) function mkcounter() local x = 0 function inc() x = x + 1 return x end function dec() x = x - 1 return x end return inc, dec end inc1, dec1 = mkcounter() print(inc1()) print(inc1()) print(dec1()) print(inc1()) print(inc1()) -- inc1 and dec1 are closures, they share the same upvalue x. -- However, when we copy inc1 and dec1 to S, we get two copies of x. S:eval([[ inc2, dec2, x = ... print("in the nested state") print("x", x) print("incrementing", inc2()) print("incrementing", inc2()) print("decrementing", dec2()) ]], inc1, dec1, 10) print(inc1()) S:set("h", f) print(S:eval([[ return h(2) ]]))