bootstrap.lua

Faddle · faddle.git · Tickets

Branches > main > latest > files / org / faddle / lang / bootstrap.lua

local loaders = package.loaders or package.searchers

local read = require("org.faddle.lang.read").read
local eval = require("org.faddle.lang.eval").eval
local modules = require("org.faddle.lang.eval").modules
local create_env = require("org.faddle.lang.eval").create_env

local faddle_path = ";?.fdl;?/init.fdl"

local function faddle_loader(mod)
  local rel = mod:gsub("%.", "/")
  for template in faddle_path:gmatch("[^;]+") do
    local path = template:gsub("%?", rel)
    local f = io.open(path, "rb")
    if f then
      local source = f:read("*a")
      f:close()
      return function()
        local env = create_env(mod)
        local forms = read(source)
        for i = 1, #forms do
          local form = forms[i]
          eval(form, env)
        end
        -- Return the module table
        return modules[env.current_module]
      end
    end
  end
end

local function bootstrap()
  table.insert(loaders, 2, faddle_loader)
  return require("org.faddle")
end

return {bootstrap = bootstrap}