Search code examples
luascopeconstantslocal-variables

Do the const and close keywords in Lua actually do anything?


I was excited to learn that, as of Lua 5.4, Lua supports constant (const) and to-be-closed (close) variables! However, upon testing these keywords, they don't seem to do anything at all. I wrote the following code to sample the features to get a better grasp of their exact usage:

function f()
  local const x = 3
  print(x)
  x = 2
  print(x)
end

f()

function g()
  local close x = {}
  setmetatable(x, {__close = function() print("closed!") end})
end

g()

I titled the file constCheck.lua and ran it with lua constCheck.lua. The output is as follows:

3
2

I was expecting an error on my call to f(), or at least for it to print 3 twice, instead it seemed to reassign x with no issue at all. Further, I was expecting the call to g() to print out "closed!" when x left scope at the end of the function, but this did not happen. I can't find very many examples of these keywords' usage. Am I using them properly? Do they work?

Note: lua -v => Lua 5.4.0 Copyright (C) 1994-2020 Lua.org, PUC-Rio


Solution

  • This is <const> not const, and <close> not close

    See https://lwn.net/Articles/826134/

    do
      local x <const> = 42
      x = x+1
    end
    -- ERROR: attempt to assign to const variable 'x'
    

    And some example https://github.com/lua/lua/blob/master/testes/code.lua#L11

    local k0aux <const> = 0

    https://github.com/lua/lua/blob/master/testes/files.lua#L128

    local f <close> = assert(io.open(file, "w"))