lua-users home
lua-l archive

A tricky way to determine Lua version (updated)

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hello everyone,
I was wandering around Stack Overflow when came across the message by Egor Skriptunoff titled "A tricky way to determine Lua version":
http://lua-users.org/lists/lua-l/2016-05/msg00297.html
It's about a "simple program that determines Lua version".
> The curious fact about this program is that it doesn't depend on anything
> that can be changed.
> It does not use any standard library function or any global variable
> (as they may be withdrawn from sandboxed environment).
> It does not rely on the name of "_ENV" upvalue
> (as it can be renamed when Lua is being built).
It was written before the Lua 5.4 release, so I decided to update it.
I ended up with the following function:
 local luaversion = function()
 if ({false, [1] = true})[1] then
 return 'LuaJIT'
 elseif 1 / 0 == 1 / '-0' then
 return 0 + '0' .. '' == '0' and 'Lua 5.4' or 'Lua 5.3'
 end
 local f = function() return function() end end
 return f() == f() and 'Lua 5.2' or 'Lua 5.1'
 end
I rely there on the following incompatibility between Lua 5.3 and 5.4 (quoted from the reference manual):
> [...] unlike in previous versions, the new implementation preserves
> the implicit type of the numeral in the string. For instance, the
> result of "1" + "2" now is an integer, not a float.
I also wrote a shell script to demonstrate how the function works with different Lua versions:
https://gist.github.com/un-def/914b1a93181e43e8a2adc35ad5c9b03a
It uses hererocks[1] to install Lua interpreters.
[1]: https://github.com/luarocks/hererocks

AltStyle によって変換されたページ (->オリジナル) /