leafo/moonscript

Support for Lua 5.4 attributes

gonzalezjo opened this issue · 0 comments

A flag to enable support for Lua 5.4 attributes would be wonderful.

Lua 5.4 introduces the concept of attributes for local variables. With this new feature, two attributes were added: const and close.

const is exactly what it sounds like: compile time enforcement of immutability. There are a few ways this can be implemented, but I believe that it's important that MoonScript include the attributes wherever possible in its output. The reason why is simple: Lua 5.4 generates better bytecode when you use const wherever applicable.

The downside is that if support for const function parameters are desired, we'd have to special-case support for them. Lua 5.4 does not have support for them.

Examples of const:

local example <const> = {"hello"}
example.foo = "bar" -- Would compile

local example_2 <const> = {"hello"}
-- example_2 = 5 -- Would NOT compile 

-- local function fn(bar <const>) end -- Would NOT compile

close, on the other hand, is a bit more difficult to explain. It essentially does two things: makes a variable const, and gives it some RAII-like behavior. The former is hopefully clear by now, but the latter might not be.

To explain what I mean by RAII-like behavior, I mean that a variable marked close is defined as one that is essentially "opened" when it's initalized, and as soon as it is out of scope, automatically gets closed. Basically, it's a new form of finalizer that's considerably better than __gc. The metamethod responsible for close is __close, and it can be pretty handy for stuff that allocates unmanaged resources. For example, a file wrapper can use __close to automatically close file handles as soon as the wrapper goes out of the scope it was made in.