lua-users home
lua-l archive

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


On Fri, Jun 16, 2017 at 6:21 PM Sean Conner <sean@conman.org> wrote:
It was thus said that the Great Jonathan Goble once stated:
> So why is it a bad idea? One, because indexing through a metamethod is
> slower than directly indexing the actual `string` table, and two, because
> shadowing a built-in global (whether with a global or local assignment) is
> usually a code smell (in any language) and generally shouldn't be done
> without a very good reason.

  You have to shadow the built-in globals for modules written in Lua 5.1
because the global environment goes away when you call module().  I still
do that in Lua 5.3 because I attempt to maintain compatability with Lua 5.1:

        local _VERSION     = _VERSION
        local math         = require "math"
        local string       = require "string"
        local io           = require "io"
        local pairs        = pairs
        local tostring     = tostring
        local type         = type
        local print        = print
        local pcall        = pcall
        local getmetatable = getmetatable

        if _VERSION == "Lua 5.1" then
          module("org.conman.table")
        else
          _ENV = {} -- luacheck: ignore
        end

        function dump(name,value)
         -- ...
        end

        if _VERSION >= "Lua 5.2" then
          return _ENV -- luacheck: ignore
        end

  Yes, I require() the base modules because that signals intent.  If I could
require() global functions like type() or pcall(), I would do that as well
(if I could do that, a side effect is that the only global in scope would be
require()).

  -spc

As I said, "generally shouldn't be done ***without a very good reason***." This is one example of such a very good reason.