diff --git a/fennel b/fennel index 550518c..b3228bb 100755 --- a/fennel +++ b/fennel @@ -3,24 +3,24 @@ -- SPDX-FileCopyrightText: Calvin Rose and contributors package.preload["fennel.binary"] = package.preload["fennel.binary"] or function(...) local fennel = require("fennel") - local _781_ = require("fennel.utils") - local copy = _781_["copy"] - local warn = _781_["warn"] + local _789_ = require("fennel.utils") + local copy = _789_["copy"] + local warn = _789_["warn"] local function shellout(command) local f = io.popen(command) local stdout = f:read("*all") return (f:close() and stdout) end local function execute(cmd) - local _782_0 = os.execute(cmd) - if (_782_0 == 0) then + local _790_0 = os.execute(cmd) + if (_790_0 == 0) then return true - elseif (_782_0 == true) then + elseif (_790_0 == true) then return true end end local function string__3ec_hex_literal(characters) - local _784_ + local _792_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -31,9 +31,9 @@ package.preload["fennel.binary"] = package.preload["fennel.binary"] or function( tbl_17_[i_18_] = val_19_ end end - _784_ = tbl_17_ + _792_ = tbl_17_ end - return table.concat(_784_, ", ") + return table.concat(_792_, ", ") end local c_shim = "#ifdef __cplusplus\nextern \"C\" {\n#endif\n#include \n#include \n#include \n#ifdef __cplusplus\n}\n#endif\n#include \n#include \n#include \n#include \n\n#if LUA_VERSION_NUM == 501\n #define LUA_OK 0\n#endif\n\n/* Copied from lua.c */\n\nstatic lua_State *globalL = NULL;\n\nstatic void lstop (lua_State *L, lua_Debug *ar) {\n (void)ar; /* unused arg. */\n lua_sethook(L, NULL, 0, 0); /* reset hook */\n luaL_error(L, \"interrupted!\");\n}\n\nstatic void laction (int i) {\n signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */\n lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);\n}\n\nstatic void createargtable (lua_State *L, char **argv, int argc, int script) {\n int i, narg;\n if (script == argc) script = 0; /* no script name? */\n narg = argc - (script + 1); /* number of positive indices */\n lua_createtable(L, narg, script + 1);\n for (i = 0; i < argc; i++) {\n lua_pushstring(L, argv[i]);\n lua_rawseti(L, -2, i - script);\n }\n lua_setglobal(L, \"arg\");\n}\n\nstatic int msghandler (lua_State *L) {\n const char *msg = lua_tostring(L, 1);\n if (msg == NULL) { /* is error object not a string? */\n if (luaL_callmeta(L, 1, \"__tostring\") && /* does it have a metamethod */\n lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */\n return 1; /* that is the message */\n else\n msg = lua_pushfstring(L, \"(error object is a %%s value)\",\n luaL_typename(L, 1));\n }\n /* Call debug.traceback() instead of luaL_traceback() for Lua 5.1 compat. */\n lua_getglobal(L, \"debug\");\n lua_getfield(L, -1, \"traceback\");\n /* debug */\n lua_remove(L, -2);\n lua_pushstring(L, msg);\n /* original msg */\n lua_remove(L, -3);\n lua_pushinteger(L, 2); /* skip this function and traceback */\n lua_call(L, 2, 1); /* call debug.traceback */\n return 1; /* return the traceback */\n}\n\nstatic int docall (lua_State *L, int narg, int nres) {\n int status;\n int base = lua_gettop(L) - narg; /* function index */\n lua_pushcfunction(L, msghandler); /* push message handler */\n lua_insert(L, base); /* put it under function and args */\n globalL = L; /* to be available to 'laction' */\n signal(SIGINT, laction); /* set C-signal handler */\n status = lua_pcall(L, narg, nres, base);\n signal(SIGINT, SIG_DFL); /* reset C-signal handler */\n lua_remove(L, base); /* remove message handler from the stack */\n return status;\n}\n\nint main(int argc, char *argv[]) {\n lua_State *L = luaL_newstate();\n luaL_openlibs(L);\n createargtable(L, argv, argc, 0);\n\n static const unsigned char lua_loader_program[] = {\n%s\n};\n if(luaL_loadbuffer(L, (const char*)lua_loader_program,\n sizeof(lua_loader_program), \"%s\") != LUA_OK) {\n fprintf(stderr, \"luaL_loadbuffer: %%s\\n\", lua_tostring(L, -1));\n lua_close(L);\n return 1;\n }\n\n /* lua_bundle */\n lua_newtable(L);\n static const unsigned char lua_require_1[] = {\n %s\n };\n lua_pushlstring(L, (const char*)lua_require_1, sizeof(lua_require_1));\n lua_setfield(L, -2, \"%s\");\n\n%s\n\n if (docall(L, 1, LUA_MULTRET)) {\n const char *errmsg = lua_tostring(L, 1);\n if (errmsg) {\n fprintf(stderr, \"%%s\\n\", errmsg);\n }\n lua_close(L);\n return 1;\n }\n lua_close(L);\n return 0;\n}" local function compile_fennel(filename, options) @@ -50,13 +50,13 @@ package.preload["fennel.binary"] = package.preload["fennel.binary"] or function( local function module_name(open, rename, used_renames) local require_name = nil do - local _787_0 = rename[open] - if (nil ~= _787_0) then - local renamed = _787_0 + local _795_0 = rename[open] + if (nil ~= _795_0) then + local renamed = _795_0 used_renames[open] = true require_name = renamed else - local _ = _787_0 + local _ = _795_0 require_name = open end end @@ -95,14 +95,14 @@ package.preload["fennel.binary"] = package.preload["fennel.binary"] or function( local dotpath = filename:gsub("^%.%/", ""):gsub("[\\/]", ".") local dotpath_noextension = (dotpath:match("(.+)%.") or dotpath) local fennel_loader = nil - local _791_ + local _799_ do - _791_ = "(do (local bundle_2_ ...) (fn loader_3_ [name_4_] (match (or (. bundle_2_ name_4_) (. bundle_2_ (.. name_4_ \".init\"))) (mod_5_ ? (= \"function\" (type mod_5_))) mod_5_ (mod_5_ ? (= \"string\" (type mod_5_))) (assert (if (= _VERSION \"Lua 5.1\") (loadstring mod_5_ name_4_) (load mod_5_ name_4_))) nil (values nil (: \"\n\\tmodule '%%s' not found in fennel bundle\" \"format\" name_4_)))) (table.insert (or package.loaders package.searchers) 2 loader_3_) ((assert (loader_3_ \"%s\")) ((or unpack table.unpack) arg)))" + _799_ = "(do (local bundle_2_ ...) (fn loader_3_ [name_4_] (match (or (. bundle_2_ name_4_) (. bundle_2_ (.. name_4_ \".init\"))) (mod_5_ ? (= \"function\" (type mod_5_))) mod_5_ (mod_5_ ? (= \"string\" (type mod_5_))) (assert (if (= _VERSION \"Lua 5.1\") (loadstring mod_5_ name_4_) (load mod_5_ name_4_))) nil (values nil (: \"\n\\tmodule '%%s' not found in fennel bundle\" \"format\" name_4_)))) (table.insert (or package.loaders package.searchers) 2 loader_3_) ((assert (loader_3_ \"%s\")) ((or unpack table.unpack) arg)))" end - fennel_loader = _791_:format(dotpath_noextension) + fennel_loader = _799_:format(dotpath_noextension) local lua_loader = fennel["compile-string"](fennel_loader) - local _792_ = options - local rename_modules = _792_["rename-modules"] + local _800_ = options + local rename_modules = _800_["rename-modules"] return c_shim:format(string__3ec_hex_literal(lua_loader), basename_noextension, string__3ec_hex_literal(compile_fennel(filename, options)), dotpath_noextension, native_loader(native, {["rename-modules"] = rename_modules})) end local function write_c(filename, native, options) @@ -115,28 +115,28 @@ package.preload["fennel.binary"] = package.preload["fennel.binary"] or function( local function compile_binary(lua_c_path, executable_name, static_lua, lua_include_dir, native) local cc = (os.getenv("CC") or "cc") local rdynamic, bin_extension, ldl_3f = nil, nil, nil - local _794_ + local _802_ do - local _793_0 = shellout((cc .. " -dumpmachine")) - if (nil ~= _793_0) then - _794_ = _793_0:match("mingw") + local _801_0 = shellout((cc .. " -dumpmachine")) + if (nil ~= _801_0) then + _802_ = _801_0:match("mingw") else - _794_ = _793_0 + _802_ = _801_0 end end - if _794_ then + if _802_ then rdynamic, bin_extension, ldl_3f = "", ".exe", false else rdynamic, bin_extension, ldl_3f = "-rdynamic", "", true end local compile_command = nil - local _797_ + local _805_ if ldl_3f then - _797_ = "-ldl" + _805_ = "-ldl" else - _797_ = "" + _805_ = "" end - compile_command = {cc, "-Os", lua_c_path, table.concat(native, " "), static_lua, rdynamic, "-lm", _797_, "-o", (executable_name .. bin_extension), "-I", lua_include_dir, os.getenv("CC_OPTS")} + compile_command = {cc, "-Os", lua_c_path, table.concat(native, " "), static_lua, rdynamic, "-lm", _805_, "-o", (executable_name .. bin_extension), "-I", lua_include_dir, os.getenv("CC_OPTS")} if os.getenv("FENNEL_DEBUG") then print("Compiling with", table.concat(compile_command, " ")) end @@ -154,17 +154,17 @@ package.preload["fennel.binary"] = package.preload["fennel.binary"] or function( if (version_extension and (version_extension ~= "") and not version_extension:match("%.%d+")) then return false else - local _802_0 = extension - if (_802_0 == "a") then + local _810_0 = extension + if (_810_0 == "a") then return path - elseif (_802_0 == "o") then + elseif (_810_0 == "o") then return path - elseif (_802_0 == "so") then + elseif (_810_0 == "so") then return path - elseif (_802_0 == "dylib") then + elseif (_810_0 == "dylib") then return path else - local _ = _802_0 + local _ = _810_0 return false end end @@ -196,10 +196,10 @@ package.preload["fennel.binary"] = package.preload["fennel.binary"] or function( return native end local function compile(filename, executable_name, static_lua, lua_include_dir, options, args) - local _809_ = extract_native_args(args) - local libraries = _809_["libraries"] - local modules = _809_["modules"] - local rename_modules = _809_["rename-modules"] + local _817_ = extract_native_args(args) + local libraries = _817_["libraries"] + local modules = _817_["modules"] + local rename_modules = _817_["rename-modules"] local opts = {["rename-modules"] = rename_modules} copy(options, opts) return compile_binary(write_c(filename, modules, opts), executable_name, static_lua, lua_include_dir, libraries) @@ -214,7 +214,6 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local compiler = require("fennel.compiler") local specials = require("fennel.specials") local view = require("fennel.view") - local unpack = (table.unpack or _G.unpack) local depth = 0 local function prompt_for(top_3f) if top_3f then @@ -234,18 +233,18 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return io.write("\n") end local function default_on_error(errtype, err, lua_source) - local function _612_() - local _611_0 = errtype - if (_611_0 == "Lua Compile") then + local function _618_() + local _617_0 = errtype + if (_617_0 == "Lua Compile") then return ("Bad code generated - likely a bug with the compiler:\n" .. "--- Generated Lua Start ---\n" .. lua_source .. "--- Generated Lua End ---\n") - elseif (_611_0 == "Runtime") then + elseif (_617_0 == "Runtime") then return (compiler.traceback(tostring(err), 4) .. "\n") else - local _ = _611_0 + local _ = _617_0 return ("%s error: %s\n"):format(errtype, tostring(err)) end end - return io.write(_612_()) + return io.write(_618_()) end local function splice_save_locals(env, lua_source, scope) local saves = nil @@ -285,25 +284,25 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) else gap = " " end - local function _618_() + local function _624_() if next(saves) then return (table.concat(saves, " ") .. gap) else return "" end end - local function _621_() - local _619_0, _620_0 = lua_source:match("^(.*)[\n ](return .*)$") - if ((nil ~= _619_0) and (nil ~= _620_0)) then - local body = _619_0 - local _return = _620_0 + local function _627_() + local _625_0, _626_0 = lua_source:match("^(.*)[\n ](return .*)$") + if ((nil ~= _625_0) and (nil ~= _626_0)) then + local body = _625_0 + local _return = _626_0 return (body .. gap .. table.concat(binds, " ") .. gap .. _return) else - local _ = _619_0 + local _ = _625_0 return lua_source end end - return (_618_() .. _621_()) + return (_624_() .. _627_()) end local function completer(env, scope, text) local max_items = 2000 @@ -315,14 +314,14 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local scope_first_3f = ((tbl == env) or (tbl == env.___replLocals___)) local tbl_17_ = matches local i_18_ = #tbl_17_ - local function _623_() + local function _629_() if scope_first_3f then return scope.manglings else return tbl end end - for k, is_mangled in utils.allpairs(_623_()) do + for k, is_mangled in utils.allpairs(_629_()) do if (max_items <= #matches) then break end local val_19_ = nil do @@ -390,7 +389,7 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return input:match("^%s*,") end local function command_docs() - local _632_ + local _638_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -401,18 +400,18 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) tbl_17_[i_18_] = val_19_ end end - _632_ = tbl_17_ + _638_ = tbl_17_ end - return table.concat(_632_, "\n") + return table.concat(_638_, "\n") end commands.help = function(_, _0, on_values) return on_values({("Welcome to Fennel.\nThis is the REPL where you can enter code to be evaluated.\nYou can also run these repl commands:\n\n" .. command_docs() .. "\n ,return FORM - Evaluate FORM and return its value to the REPL's caller.\n ,exit - Leave the repl.\n\nUse ,doc something to see descriptions for individual macros and special forms.\nValues from previous inputs are kept in *1, *2, and *3.\n\nFor more information about the language, see https://fennel-lang.org/reference")}) end do end (compiler.metadata):set(commands.help, "fnl/docstring", "Show this message.") local function reload(module_name, env, on_values, on_error) - local _634_0, _635_0 = pcall(specials["load-code"]("return require(...)", env), module_name) - if ((_634_0 == true) and (nil ~= _635_0)) then - local old = _635_0 + local _640_0, _641_0 = pcall(specials["load-code"]("return require(...)", env), module_name) + if ((_640_0 == true) and (nil ~= _641_0)) then + local old = _641_0 local _ = nil package.loaded[module_name] = nil _ = nil @@ -437,8 +436,8 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) package.loaded[module_name] = old end return on_values({"ok"}) - elseif ((_634_0 == false) and (nil ~= _635_0)) then - local msg = _635_0 + elseif ((_640_0 == false) and (nil ~= _641_0)) then + local msg = _641_0 if msg:match("loop or previous error loading module") then package.loaded[module_name] = nil return reload(module_name, env, on_values, on_error) @@ -446,32 +445,32 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) specials["macro-loaded"][module_name] = nil return nil else - local function _640_() - local _639_0 = msg:gsub("\n.*", "") - return _639_0 + local function _646_() + local _645_0 = msg:gsub("\n.*", "") + return _645_0 end - return on_error("Runtime", _640_()) + return on_error("Runtime", _646_()) end end end local function run_command(read, on_error, f) - local _643_0, _644_0, _645_0 = pcall(read) - if ((_643_0 == true) and (_644_0 == true) and (nil ~= _645_0)) then - local val = _645_0 - local _646_0, _647_0 = pcall(f, val) - if ((_646_0 == false) and (nil ~= _647_0)) then - local msg = _647_0 + local _649_0, _650_0, _651_0 = pcall(read) + if ((_649_0 == true) and (_650_0 == true) and (nil ~= _651_0)) then + local val = _651_0 + local _652_0, _653_0 = pcall(f, val) + if ((_652_0 == false) and (nil ~= _653_0)) then + local msg = _653_0 return on_error("Runtime", msg) end - elseif (_643_0 == false) then + elseif (_649_0 == false) then return on_error("Parse", "Couldn't parse input.") end end commands.reload = function(env, read, on_values, on_error) - local function _650_(_241) + local function _656_(_241) return reload(tostring(_241), env, on_values, on_error) end - return run_command(read, on_error, _650_) + return run_command(read, on_error, _656_) end do end (compiler.metadata):set(commands.reload, "fnl/docstring", "Reload the specified module.") commands.reset = function(env, _, on_values) @@ -480,28 +479,28 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end do end (compiler.metadata):set(commands.reset, "fnl/docstring", "Erase all repl-local scope.") commands.complete = function(env, read, on_values, on_error, scope, chars) - local function _651_() + local function _657_() return on_values(completer(env, scope, table.concat(chars):gsub(",complete +", ""):sub(1, -2))) end - return run_command(read, on_error, _651_) + return run_command(read, on_error, _657_) end do end (compiler.metadata):set(commands.complete, "fnl/docstring", "Print all possible completions for a given input symbol.") local function apropos_2a(pattern, tbl, prefix, seen, names) for name, subtbl in pairs(tbl) do if (("string" == type(name)) and (package ~= subtbl)) then - local _652_0 = type(subtbl) - if (_652_0 == "function") then + local _658_0 = type(subtbl) + if (_658_0 == "function") then if ((prefix .. name)):match(pattern) then table.insert(names, (prefix .. name)) end - elseif (_652_0 == "table") then + elseif (_658_0 == "table") then if not seen[subtbl] then - local _654_ + local _660_ do seen[subtbl] = true - _654_ = seen + _660_ = seen end - apropos_2a(pattern, subtbl, (prefix .. name:gsub("%.", "/") .. "."), _654_, names) + apropos_2a(pattern, subtbl, (prefix .. name:gsub("%.", "/") .. "."), _660_, names) end end end @@ -522,10 +521,10 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return tbl_17_ end commands.apropos = function(_env, read, on_values, on_error, _scope) - local function _659_(_241) + local function _665_(_241) return on_values(apropos(tostring(_241))) end - return run_command(read, on_error, _659_) + return run_command(read, on_error, _665_) end do end (compiler.metadata):set(commands.apropos, "fnl/docstring", "Print all functions matching a pattern in all loaded modules.") local function apropos_follow_path(path) @@ -545,12 +544,12 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local tgt = package.loaded for _, path0 in ipairs(paths) do if (nil == tgt) then break end - local _662_ + local _668_ do - local _661_0 = path0:gsub("%/", ".") - _662_ = _661_0 + local _667_0 = path0:gsub("%/", ".") + _668_ = _667_0 end - tgt = tgt[_662_] + tgt = tgt[_668_] end return tgt end @@ -562,9 +561,9 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) do local tgt = apropos_follow_path(path) if ("function" == type(tgt)) then - local _663_0 = (compiler.metadata):get(tgt, "fnl/docstring") - if (nil ~= _663_0) then - local docstr = _663_0 + local _669_0 = (compiler.metadata):get(tgt, "fnl/docstring") + if (nil ~= _669_0) then + local docstr = _669_0 val_19_ = (docstr:match(pattern) and path) else val_19_ = nil @@ -581,10 +580,10 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return tbl_17_ end commands["apropos-doc"] = function(_env, read, on_values, on_error, _scope) - local function _667_(_241) + local function _673_(_241) return on_values(apropos_doc(tostring(_241))) end - return run_command(read, on_error, _667_) + return run_command(read, on_error, _673_) end do end (compiler.metadata):set(commands["apropos-doc"], "fnl/docstring", "Print all functions that match the pattern in their docs") local function apropos_show_docs(on_values, pattern) @@ -598,108 +597,108 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return nil end commands["apropos-show-docs"] = function(_env, read, on_values, on_error) - local function _669_(_241) + local function _675_(_241) return apropos_show_docs(on_values, tostring(_241)) end - return run_command(read, on_error, _669_) + return run_command(read, on_error, _675_) end do end (compiler.metadata):set(commands["apropos-show-docs"], "fnl/docstring", "Print all documentations matching a pattern in function name") - local function resolve(identifier, _670_0, scope) - local _671_ = _670_0 - local env = _671_ - local ___replLocals___ = _671_["___replLocals___"] + local function resolve(identifier, _676_0, scope) + local _677_ = _676_0 + local env = _677_ + local ___replLocals___ = _677_["___replLocals___"] local e = nil - local function _672_(_241, _242) + local function _678_(_241, _242) return (___replLocals___[scope.unmanglings[_242]] or env[_242]) end - e = setmetatable({}, {__index = _672_}) - local function _673_(...) - local _674_0, _675_0 = ... - if ((_674_0 == true) and (nil ~= _675_0)) then - local code = _675_0 - local function _676_(...) - local _677_0, _678_0 = ... - if ((_677_0 == true) and (nil ~= _678_0)) then - local val = _678_0 + e = setmetatable({}, {__index = _678_}) + local function _679_(...) + local _680_0, _681_0 = ... + if ((_680_0 == true) and (nil ~= _681_0)) then + local code = _681_0 + local function _682_(...) + local _683_0, _684_0 = ... + if ((_683_0 == true) and (nil ~= _684_0)) then + local val = _684_0 return val else - local _ = _677_0 + local _ = _683_0 return nil end end - return _676_(pcall(specials["load-code"](code, e))) + return _682_(pcall(specials["load-code"](code, e))) else - local _ = _674_0 + local _ = _680_0 return nil end end - return _673_(pcall(compiler["compile-string"], tostring(identifier), {scope = scope})) + return _679_(pcall(compiler["compile-string"], tostring(identifier), {scope = scope})) end commands.find = function(env, read, on_values, on_error, scope) - local function _681_(_241) - local _682_0 = nil + local function _687_(_241) + local _688_0 = nil do - local _683_0 = utils["sym?"](_241) - if (nil ~= _683_0) then - local _684_0 = resolve(_683_0, env, scope) - if (nil ~= _684_0) then - _682_0 = debug.getinfo(_684_0) + local _689_0 = utils["sym?"](_241) + if (nil ~= _689_0) then + local _690_0 = resolve(_689_0, env, scope) + if (nil ~= _690_0) then + _688_0 = debug.getinfo(_690_0) else - _682_0 = _684_0 + _688_0 = _690_0 end else - _682_0 = _683_0 + _688_0 = _689_0 end end - if ((_G.type(_682_0) == "table") and (nil ~= _682_0.linedefined) and (nil ~= _682_0.short_src) and (nil ~= _682_0.source) and (_682_0.what == "Lua")) then - local line = _682_0.linedefined - local src = _682_0.short_src - local source = _682_0.source + if ((_G.type(_688_0) == "table") and (nil ~= _688_0.linedefined) and (nil ~= _688_0.short_src) and (nil ~= _688_0.source) and (_688_0.what == "Lua")) then + local line = _688_0.linedefined + local src = _688_0.short_src + local source = _688_0.source local fnlsrc = nil do - local _687_0 = compiler.sourcemap - if (nil ~= _687_0) then - _687_0 = _687_0[source] + local _693_0 = compiler.sourcemap + if (nil ~= _693_0) then + _693_0 = _693_0[source] end - if (nil ~= _687_0) then - _687_0 = _687_0[line] + if (nil ~= _693_0) then + _693_0 = _693_0[line] end - if (nil ~= _687_0) then - _687_0 = _687_0[2] + if (nil ~= _693_0) then + _693_0 = _693_0[2] end - fnlsrc = _687_0 + fnlsrc = _693_0 end return on_values({string.format("%s:%s", src, (fnlsrc or line))}) - elseif (_682_0 == nil) then + elseif (_688_0 == nil) then return on_error("Repl", "Unknown value") else - local _ = _682_0 + local _ = _688_0 return on_error("Repl", "No source info") end end - return run_command(read, on_error, _681_) + return run_command(read, on_error, _687_) end do end (compiler.metadata):set(commands.find, "fnl/docstring", "Print the filename and line number for a given function") commands.doc = function(env, read, on_values, on_error, scope) - local function _692_(_241) + local function _698_(_241) local name = tostring(_241) local path = (utils["multi-sym?"](name) or {name}) local ok_3f, target = nil, nil - local function _693_() + local function _699_() return (utils["get-in"](scope.specials, path) or utils["get-in"](scope.macros, path) or resolve(name, env, scope)) end - ok_3f, target = pcall(_693_) + ok_3f, target = pcall(_699_) if ok_3f then return on_values({specials.doc(target, name)}) else return on_error("Repl", ("Could not find " .. name .. " for docs.")) end end - return run_command(read, on_error, _692_) + return run_command(read, on_error, _698_) end do end (compiler.metadata):set(commands.doc, "fnl/docstring", "Print the docstring and arglist for a function, macro, or special form.") commands.compile = function(env, read, on_values, on_error, scope) - local function _695_(_241) + local function _701_(_241) local allowedGlobals = specials["current-global-names"](env) local ok_3f, result = pcall(compiler.compile, _241, {allowedGlobals = allowedGlobals, env = env, scope = scope}) if ok_3f then @@ -708,15 +707,15 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return on_error("Repl", ("Error compiling expression: " .. result)) end end - return run_command(read, on_error, _695_) + return run_command(read, on_error, _701_) end do end (compiler.metadata):set(commands.compile, "fnl/docstring", "compiles the expression into lua and prints the result.") local function load_plugin_commands(plugins) for i = #(plugins or {}), 1, -1 do for name, f in pairs(plugins[i]) do - local _697_0 = name:match("^repl%-command%-(.*)") - if (nil ~= _697_0) then - local cmd_name = _697_0 + local _703_0 = name:match("^repl%-command%-(.*)") + if (nil ~= _703_0) then + local cmd_name = _703_0 commands[cmd_name] = f end end @@ -726,12 +725,12 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local function run_command_loop(input, read, loop, env, on_values, on_error, scope, chars) local command_name = input:match(",([^%s/]+)") do - local _699_0 = commands[command_name] - if (nil ~= _699_0) then - local command = _699_0 + local _705_0 = commands[command_name] + if (nil ~= _705_0) then + local command = _705_0 command(env, read, on_values, on_error, scope, chars) else - local _ = _699_0 + local _ = _705_0 if ((command_name ~= "exit") and (command_name ~= "return")) then on_values({"Unknown command", command_name}) end @@ -781,9 +780,9 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end local function repl(_3foptions) local old_root_options = utils.root.options - local _708_ = utils.copy(_3foptions) - local opts = _708_ - local _3ffennelrc = _708_["fennelrc"] + local _714_ = utils.copy(_3foptions) + local opts = _714_ + local _3ffennelrc = _714_["fennelrc"] local _ = nil opts.fennelrc = nil _ = nil @@ -798,20 +797,20 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local callbacks = {env = env, onError = (opts.onError or default_on_error), onValues = (opts.onValues or default_on_values), pp = (opts.pp or view), readChunk = (opts.readChunk or default_read_chunk)} local save_locals_3f = (opts.saveLocals ~= false) local byte_stream, clear_stream = nil, nil - local function _710_(_241) + local function _716_(_241) return callbacks.readChunk(_241) end - byte_stream, clear_stream = parser.granulate(_710_) + byte_stream, clear_stream = parser.granulate(_716_) local chars = {} local read, reset = nil, nil - local function _711_(parser_state) + local function _717_(parser_state) local b = byte_stream(parser_state) if b then table.insert(chars, string.char(b)) end return b end - read, reset = parser.parser(_711_) + read, reset = parser.parser(_717_) depth = (depth + 1) if opts.message then callbacks.onValues({opts.message}) @@ -826,14 +825,14 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) opts.init(opts, depth) end if opts.registerCompleter then - local function _717_() - local _716_0 = opts.scope - local function _718_(...) - return completer(env, _716_0, ...) + local function _723_() + local _722_0 = opts.scope + local function _724_(...) + return completer(env, _722_0, ...) end - return _718_ + return _724_ end - opts.registerCompleter(_717_()) + opts.registerCompleter(_723_()) end load_plugin_commands(opts.plugins) if save_locals_3f then @@ -880,28 +879,28 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return run_command_loop(src_string, read, loop, env, callbacks.onValues, callbacks.onError, opts.scope, chars) else if not_eof_3f then - local function _722_(...) - local _723_0, _724_0 = ... - if ((_723_0 == true) and (nil ~= _724_0)) then - local src = _724_0 - local function _725_(...) - local _726_0, _727_0 = ... - if ((_726_0 == true) and (nil ~= _727_0)) then - local chunk = _727_0 - local function _728_() + local function _728_(...) + local _729_0, _730_0 = ... + if ((_729_0 == true) and (nil ~= _730_0)) then + local src = _730_0 + local function _731_(...) + local _732_0, _733_0 = ... + if ((_732_0 == true) and (nil ~= _733_0)) then + local chunk = _733_0 + local function _734_() return print_values(save_value(chunk())) end - local function _729_(...) + local function _735_(...) return callbacks.onError("Runtime", ...) end - return xpcall(_728_, _729_) - elseif ((_726_0 == false) and (nil ~= _727_0)) then - local msg = _727_0 + return xpcall(_734_, _735_) + elseif ((_732_0 == false) and (nil ~= _733_0)) then + local msg = _733_0 clear_stream() return callbacks.onError("Compile", msg) end end - local function _732_(...) + local function _738_(...) local src0 = nil if save_locals_3f then src0 = splice_save_locals(env, src, opts.scope) @@ -910,18 +909,18 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end return pcall(specials["load-code"], src0, env) end - return _725_(_732_(...)) - elseif ((_723_0 == false) and (nil ~= _724_0)) then - local msg = _724_0 + return _731_(_738_(...)) + elseif ((_729_0 == false) and (nil ~= _730_0)) then + local msg = _730_0 clear_stream() return callbacks.onError("Compile", msg) end end - local function _734_() + local function _740_() opts["source"] = src_string return opts end - _722_(pcall(compiler.compile, form, _734_())) + _728_(pcall(compiler.compile, form, _740_())) utils.root.options = old_root_options if exit_next_3f then return env.___replLocals___["*1"] @@ -941,7 +940,10 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end return value end - return repl + local function _746_(overrides, _3fopts) + return repl(utils.copy(_3fopts, utils.copy(overrides))) + end + return setmetatable({}, {__call = _746_, __index = {repl = repl}}) end package.preload["fennel.specials"] = package.preload["fennel.specials"] or function(...) local utils = require("fennel.utils") @@ -951,14 +953,14 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local unpack = (table.unpack or _G.unpack) local SPECIALS = compiler.scopes.global.specials local function wrap_env(env) - local function _417_(_, key) + local function _420_(_, key) if utils["string?"](key) then return env[compiler["global-unmangling"](key)] else return env[key] end end - local function _419_(_, key, value) + local function _422_(_, key, value) if utils["string?"](key) then env[compiler["global-unmangling"](key)] = value return nil @@ -967,26 +969,29 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return nil end end - local function _421_() + local function _424_() local function putenv(k, v) - local _422_ + local _425_ if utils["string?"](k) then - _422_ = compiler["global-unmangling"](k) + _425_ = compiler["global-unmangling"](k) else - _422_ = k + _425_ = k end - return _422_, v + return _425_, v end return next, utils.kvmap(env, putenv), nil end - return setmetatable({}, {__index = _417_, __newindex = _419_, __pairs = _421_}) + return setmetatable({}, {__index = _420_, __newindex = _422_, __pairs = _424_}) + end + local function fennel_module_name() + return (utils.root.options.moduleName or "fennel") end local function current_global_names(_3fenv) local mt = nil do - local _424_0 = getmetatable(_3fenv) - if ((_G.type(_424_0) == "table") and (nil ~= _424_0.__pairs)) then - local mtpairs = _424_0.__pairs + local _427_0 = getmetatable(_3fenv) + if ((_G.type(_427_0) == "table") and (nil ~= _427_0.__pairs)) then + local mtpairs = _427_0.__pairs local tbl_14_ = {} for k, v in mtpairs(_3fenv) do local k_15_, v_16_ = k, v @@ -995,7 +1000,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end mt = tbl_14_ - elseif (_424_0 == nil) then + elseif (_427_0 == nil) then mt = (_3fenv or _G) else mt = nil @@ -1005,15 +1010,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local function load_code(code, _3fenv, _3ffilename) local env = (_3fenv or rawget(_G, "_ENV") or _G) - local _427_0, _428_0 = rawget(_G, "setfenv"), rawget(_G, "loadstring") - if ((nil ~= _427_0) and (nil ~= _428_0)) then - local setfenv = _427_0 - local loadstring = _428_0 + local _430_0, _431_0 = rawget(_G, "setfenv"), rawget(_G, "loadstring") + if ((nil ~= _430_0) and (nil ~= _431_0)) then + local setfenv = _430_0 + local loadstring = _431_0 local f = assert(loadstring(code, _3ffilename)) setfenv(f, env) return f else - local _ = _427_0 + local _ = _430_0 return assert(load(code, _3ffilename, "t", env)) end end @@ -1025,13 +1030,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local mt = getmetatable(tgt) if ((type(tgt) == "function") or ((type(mt) == "table") and (type(mt.__call) == "function"))) then local arglist = table.concat(((compiler.metadata):get(tgt, "fnl/arglist") or {"#"}), " ") - local _430_ + local _433_ if (0 < #arglist) then - _430_ = " " + _433_ = " " else - _430_ = "" + _433_ = "" end - return string.format("(%s%s%s)\n %s", name, _430_, arglist, docstring) + return string.format("(%s%s%s)\n %s", name, _433_, arglist, docstring) else return string.format("%s\n %s", name, docstring) end @@ -1141,9 +1146,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local opts = {nval = 1, tail = false} local scope = compiler["make-scope"]() local chunk = {} - local _440_ = compiler.compile1(v, scope, chunk, opts) - local _441_ = _440_[1] - local v0 = _441_[1] + local _443_ = compiler.compile1(v, scope, chunk, opts) + local _444_ = _443_[1] + local v0 = _444_[1] return v0 end local function insert_meta(meta, k, v) @@ -1151,23 +1156,23 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.assert((type(k) == "string"), ("expected string keys in metadata table, got: %s"):format(view(k, view_opts))) compiler.assert(literal_3f(v), ("expected literal value in metadata table, got: %s %s"):format(view(k, view_opts), view(v, view_opts))) table.insert(meta, view(k)) - local function _442_() + local function _445_() if ("string" == type(v)) then return view(v, view_opts) else return compile_value(v) end end - table.insert(meta, _442_()) + table.insert(meta, _445_()) return meta end local function insert_arglist(meta, arg_list) local view_opts = {["escape-newlines?"] = true, ["line-length"] = math.huge, ["one-line?"] = true} table.insert(meta, "\"fnl/arglist\"") - local function _443_(_241) + local function _446_(_241) return view(view(_241, view_opts)) end - table.insert(meta, ("{" .. table.concat(utils.map(arg_list, _443_), ", ") .. "}")) + table.insert(meta, ("{" .. table.concat(utils.map(arg_list, _446_), ", ") .. "}")) return meta end local function set_fn_metadata(f_metadata, parent, fn_name) @@ -1180,19 +1185,19 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct insert_meta(meta_fields, k, v) end end - local meta_str = ("require(\"%s\").metadata"):format((utils.root.options.moduleName or "fennel")) + local meta_str = ("require(\"%s\").metadata"):format(fennel_module_name()) return compiler.emit(parent, ("pcall(function() %s:setall(%s, %s) end)"):format(meta_str, fn_name, table.concat(meta_fields, ", "))) end end local function get_fn_name(ast, scope, fn_name, multi) if (fn_name and (fn_name[1] ~= "nil")) then - local _446_ + local _449_ if not multi then - _446_ = compiler["declare-local"](fn_name, {}, scope, ast) + _449_ = compiler["declare-local"](fn_name, {}, scope, ast) else - _446_ = compiler["symbol-to-expression"](fn_name, scope)[1] + _449_ = compiler["symbol-to-expression"](fn_name, scope)[1] end - return _446_, not multi, 3 + return _449_, not multi, 3 else return nil, true, 2 end @@ -1202,13 +1207,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct for i = (index + 1), #ast do compiler.compile1(ast[i], f_scope, f_chunk, {nval = (((i ~= #ast) and 0) or nil), tail = (i == #ast)}) end - local _449_ + local _452_ if local_3f then - _449_ = "local function %s(%s)" + _452_ = "local function %s(%s)" else - _449_ = "%s = function(%s)" + _452_ = "%s = function(%s)" end - compiler.emit(parent, string.format(_449_, fn_name, table.concat(arg_name_list, ", ")), ast) + compiler.emit(parent, string.format(_452_, fn_name, table.concat(arg_name_list, ", ")), ast) compiler.emit(parent, f_chunk, ast) compiler.emit(parent, "end", ast) set_fn_metadata(f_metadata, parent, fn_name) @@ -1230,7 +1235,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end local function get_function_metadata(ast, arg_list, index) - local function _452_(_241, _242) + local function _455_(_241, _242) local tbl_14_ = _241 for k, v in pairs(_242) do local k_15_, v_16_ = k, v @@ -1240,18 +1245,18 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return tbl_14_ end - local function _454_(_241, _242) + local function _457_(_241, _242) _241["fnl/docstring"] = _242 return _241 end - return maybe_metadata(ast, utils["kv-table?"], _452_, maybe_metadata(ast, utils["string?"], _454_, {["fnl/arglist"] = arg_list}, index)) + return maybe_metadata(ast, utils["kv-table?"], _455_, maybe_metadata(ast, utils["string?"], _457_, {["fnl/arglist"] = arg_list}, index)) end SPECIALS.fn = function(ast, scope, parent) local f_scope = nil do - local _455_0 = compiler["make-scope"](scope) - _455_0["vararg"] = false - f_scope = _455_0 + local _458_0 = compiler["make-scope"](scope) + _458_0["vararg"] = false + f_scope = _458_0 end local f_chunk = {} local fn_sym = utils["sym?"](ast[2]) @@ -1311,36 +1316,37 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct doc_special("fn", {"name?", "args", "docstring?", "..."}, "Function syntax. May optionally include a name and docstring or a metadata table.\nIf a name is provided, the function will be bound in the current scope.\nWhen called with the wrong number of args, excess args will be discarded\nand lacking args will be nil, use lambda for arity-checked functions.", true) SPECIALS.lua = function(ast, _, parent) compiler.assert(((#ast == 2) or (#ast == 3)), "expected 1 or 2 arguments", ast) - local _460_ + local _463_ do - local _459_0 = utils["sym?"](ast[2]) - if (nil ~= _459_0) then - _460_ = tostring(_459_0) + local _462_0 = utils["sym?"](ast[2]) + if (nil ~= _462_0) then + _463_ = tostring(_462_0) else - _460_ = _459_0 + _463_ = _462_0 end end - if ("nil" ~= _460_) then + if ("nil" ~= _463_) then table.insert(parent, {ast = ast, leaf = tostring(ast[2])}) end - local _464_ + local _467_ do - local _463_0 = utils["sym?"](ast[3]) - if (nil ~= _463_0) then - _464_ = tostring(_463_0) + local _466_0 = utils["sym?"](ast[3]) + if (nil ~= _466_0) then + _467_ = tostring(_466_0) else - _464_ = _463_0 + _467_ = _466_0 end end - if ("nil" ~= _464_) then + if ("nil" ~= _467_) then return tostring(ast[3]) end end local function dot(ast, scope, parent) compiler.assert((1 < #ast), "expected table argument", ast) local len = #ast - local _467_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local lhs = _467_[1] + local lhs_node = compiler.macroexpand(ast[2], scope) + local _470_ = compiler.compile1(lhs_node, scope, parent, {nval = 1}) + local lhs = _470_[1] if (len == 2) then return tostring(lhs) else @@ -1350,12 +1356,12 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct if (utils["string?"](index) and utils["valid-lua-identifier?"](index)) then table.insert(indices, ("." .. index)) else - local _468_ = compiler.compile1(index, scope, parent, {nval = 1}) - local index0 = _468_[1] + local _471_ = compiler.compile1(index, scope, parent, {nval = 1}) + local index0 = _471_[1] table.insert(indices, ("[" .. tostring(index0) .. "]")) end end - if (not (utils["sym?"](ast[2]) or utils["list?"](ast[2])) or ("nil" == tostring(lhs))) then + if (not (utils["sym?"](lhs_node) or utils["list?"](lhs_node)) or ("nil" == tostring(lhs_node))) then return ("(" .. tostring(lhs) .. ")" .. table.concat(indices)) else return (tostring(lhs) .. table.concat(indices)) @@ -1396,7 +1402,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end doc_special("var", {"name", "val"}, "Introduce new mutable local.") local function kv_3f(t) - local _472_ + local _475_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -1412,9 +1418,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct tbl_17_[i_18_] = val_19_ end end - _472_ = tbl_17_ + _475_ = tbl_17_ end - return _472_[1] + return _475_[1] end SPECIALS.let = function(ast, scope, parent, opts) local bindings = ast[2] @@ -1441,22 +1447,22 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end local function disambiguate_3f(rootstr, parent) - local function _477_() - local _476_0 = get_prev_line(parent) - if (nil ~= _476_0) then - local prev_line = _476_0 + local function _480_() + local _479_0 = get_prev_line(parent) + if (nil ~= _479_0) then + local prev_line = _479_0 return prev_line:match("%)$") end end - return (rootstr:match("^{") or rootstr:match("^%(") or _477_()) + return (rootstr:match("^{") or rootstr:match("^%(") or _480_()) end SPECIALS.tset = function(ast, scope, parent) compiler.assert((3 < #ast), "expected table, key, and value arguments", ast) local root = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] local keys = {} for i = 3, (#ast - 1) do - local _479_ = compiler.compile1(ast[i], scope, parent, {nval = 1}) - local key = _479_[1] + local _482_ = compiler.compile1(ast[i], scope, parent, {nval = 1}) + local key = _482_[1] table.insert(keys, tostring(key)) end local value = compiler.compile1(ast[#ast], scope, parent, {nval = 1})[1] @@ -1574,32 +1580,56 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end SPECIALS["if"] = if_2a doc_special("if", {"cond1", "body1", "...", "condN", "bodyN"}, "Conditional form.\nTakes any number of condition/body pairs and evaluates the first body where\nthe condition evaluates to truthy. Similar to cond in other lisps.") - local function remove_until_condition(bindings) - local last_item = bindings[(#bindings - 1)] - if ((utils["sym?"](last_item) and (tostring(last_item) == "&until")) or ("until" == last_item)) then - table.remove(bindings, (#bindings - 1)) - return table.remove(bindings) + local function clause_3f(v) + return (utils["string?"](v) or (utils["sym?"](v) and not utils["multi-sym?"](v) and tostring(v):match("^&(.+)"))) + end + local function remove_until_condition(bindings, ast) + local _until = nil + for i = (#bindings - 1), 3, -1 do + local _492_0 = clause_3f(bindings[i]) + if ((_492_0 == false) or (_492_0 == nil)) then + elseif (nil ~= _492_0) then + local clause = _492_0 + compiler.assert(((clause == "until") and not _until), ("unexpected iterator clause: " .. clause), ast) + table.remove(bindings, i) + _until = table.remove(bindings, i) + end end + return _until end local function compile_until(_3fcondition, scope, chunk) if _3fcondition then - local _490_ = compiler.compile1(_3fcondition, scope, chunk, {nval = 1}) - local condition_lua = _490_[1] + local _494_ = compiler.compile1(_3fcondition, scope, chunk, {nval = 1}) + local condition_lua = _494_[1] return compiler.emit(chunk, ("if %s then break end"):format(tostring(condition_lua)), utils.expr(_3fcondition, "expression")) end end + local function iterator_bindings(ast) + local bindings = utils.copy(ast) + local _3funtil = remove_until_condition(bindings, ast) + local iter = table.remove(bindings) + local bindings0 = nil + if (1 == #bindings) then + bindings0 = (utils["list?"](bindings[1]) or bindings) + else + for _, b in ipairs(bindings) do + if utils["list?"](b) then + utils.warn("unexpected parens in iterator", b) + end + end + bindings0 = bindings + end + return bindings0, iter, _3funtil + end SPECIALS.each = function(ast, scope, parent) compiler.assert((3 <= #ast), "expected body expression", ast[1]) compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) - local binding = setmetatable(utils.copy(ast[2]), getmetatable(ast[2])) local sub_scope = compiler["make-scope"](scope) - local _3funtil_condition = remove_until_condition(binding) - local iter = table.remove(binding, #binding) + local binding, iter, _3funtil_condition = iterator_bindings(ast[2]) local destructures = {} local new_manglings = {} utils.hook("pre-each", ast, sub_scope, binding, iter, _3funtil_condition) local function destructure_binding(v) - compiler.assert(not utils["string?"](v), ("unexpected iterator clause " .. tostring(v)), binding) if utils["sym?"](v) then return compiler["declare-local"](v, {}, sub_scope, ast, new_manglings) else @@ -1648,7 +1678,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function for_2a(ast, scope, parent) compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) local ranges = setmetatable(utils.copy(ast[2]), getmetatable(ast[2])) - local until_condition = remove_until_condition(ranges) + local until_condition = remove_until_condition(ranges, ast) local binding_sym = table.remove(ranges, 1) local sub_scope = compiler["make-scope"](scope) local range_args = {} @@ -1670,10 +1700,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct SPECIALS["for"] = for_2a doc_special("for", {"[index start stop step?]", "..."}, "Numeric loop construct.\nEvaluates body once for each value between start and stop (inclusive).", true) local function native_method_call(ast, _scope, _parent, target, args) - local _494_ = ast - local _ = _494_[1] - local _0 = _494_[2] - local method_string = _494_[3] + local _500_ = ast + local _ = _500_[1] + local _0 = _500_[2] + local method_string = _500_[3] local call_string = nil if ((target.type == "literal") or (target.type == "varg") or (target.type == "expression")) then call_string = "(%s):%s(%s)" @@ -1695,18 +1725,18 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local function method_call(ast, scope, parent) compiler.assert((2 < #ast), "expected at least 2 arguments", ast) - local _496_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local target = _496_[1] + local _502_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local target = _502_[1] local args = {} for i = 4, #ast do local subexprs = nil - local _497_ + local _503_ if (i ~= #ast) then - _497_ = 1 + _503_ = 1 else - _497_ = nil + _503_ = nil end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _497_}) + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _503_}) utils.map(subexprs, tostring, args) end if (utils["string?"](ast[3]) and utils["valid-lua-identifier?"](ast[3])) then @@ -1721,7 +1751,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct doc_special(":", {"tbl", "method-name", "..."}, "Call the named method on tbl with the provided args.\nMethod name doesn't have to be known at compile-time; if it is, use\n(tbl:method-name ...) instead.") SPECIALS.comment = function(ast, _, parent) local c = nil - local _500_ + local _506_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -1737,9 +1767,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct tbl_17_[i_18_] = val_19_ end end - _500_ = tbl_17_ + _506_ = tbl_17_ end - c = table.concat(_500_, " "):gsub("%]%]", "]\\]") + c = table.concat(_506_, " "):gsub("%]%]", "]\\]") return compiler.emit(parent, ("--[[ " .. c .. " ]]"), ast) end doc_special("comment", {"..."}, "Comment which will be emitted in Lua output.", true) @@ -1760,10 +1790,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.assert((#ast == 2), "expected one argument", ast) local f_scope = nil do - local _505_0 = compiler["make-scope"](scope) - _505_0["vararg"] = false - _505_0["hashfn"] = true - f_scope = _505_0 + local _511_0 = compiler["make-scope"](scope) + _511_0["vararg"] = false + _511_0["hashfn"] = true + f_scope = _511_0 end local f_chunk = {} local name = compiler.gensym(scope) @@ -1804,9 +1834,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return utils.expr(name, "sym") end doc_special("hashfn", {"..."}, "Function literal shorthand; args are either $... OR $1, $2, etc.") - local function maybe_short_circuit_protect(ast, i, name, _510_0) - local _511_ = _510_0 - local mac = _511_["macros"] + local function maybe_short_circuit_protect(ast, i, name, _516_0) + local _517_ = _516_0 + local mac = _517_["macros"] local call = (utils["list?"](ast) and tostring(ast[1])) if ((("or" == name) or ("and" == name)) and (1 < i) and (mac[call] or ("set" == call) or ("tset" == call) or ("global" == call))) then return utils.list(utils.list(utils.sym("fn"), utils.sequence(utils.varg()), ast)) @@ -1827,15 +1857,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct table.insert(operands, tostring(subexprs[1])) end end - local _514_0 = #operands - if (_514_0 == 0) then - local _515_ + local _520_0 = #operands + if (_520_0 == 0) then + local _521_ do compiler.assert(zero_arity, "Expected more than 0 arguments", ast) - _515_ = zero_arity + _521_ = zero_arity end - return utils.expr(_515_, "literal") - elseif (_514_0 == 1) then + return utils.expr(_521_, "literal") + elseif (_520_0 == 1) then if utils["varg?"](ast[2]) then return compiler.assert(false, "tried to use vararg with operator", ast) elseif unary_prefix then @@ -1844,20 +1874,20 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return operands[1] end else - local _ = _514_0 + local _ = _520_0 return ("(" .. table.concat(operands, padded_op) .. ")") end end local function define_arithmetic_special(name, zero_arity, unary_prefix, _3flua_name) - local _519_ + local _525_ do - local _518_0 = (_3flua_name or name) - local function _520_(...) - return operator_special(_518_0, zero_arity, unary_prefix, ...) + local _524_0 = (_3flua_name or name) + local function _526_(...) + return operator_special(_524_0, zero_arity, unary_prefix, ...) end - _519_ = _520_ + _525_ = _526_ end - SPECIALS[name] = _519_ + SPECIALS[name] = _525_ return doc_special(name, {"a", "b", "..."}, "Arithmetic operator; works the same as Lua but accepts more arguments.") end define_arithmetic_special("+", "0") @@ -1886,13 +1916,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local prefixed_lib_name = ("bit." .. lib_name) for i = 2, len do local subexprs = nil - local _521_ + local _527_ if (i ~= len) then - _521_ = 1 + _527_ = 1 else - _521_ = nil + _527_ = nil end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _521_}) + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _527_}) utils.map(subexprs, tostring, operands) end if (#operands == 1) then @@ -1911,15 +1941,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end local function define_bitop_special(name, zero_arity, unary_prefix, native) - local function _527_(...) + local function _533_(...) return bitop_special(native, name, zero_arity, unary_prefix, ...) end - SPECIALS[name] = _527_ + SPECIALS[name] = _533_ return nil end define_bitop_special("lshift", nil, "1", "<<") define_bitop_special("rshift", nil, "1", ">>") - define_bitop_special("band", "0", "0", "&") + define_bitop_special("band", "-1", "-1", "&") define_bitop_special("bor", "0", "0", "|") define_bitop_special("bxor", "0", "0", "~") doc_special("lshift", {"x", "n"}, "Bitwise logical left shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") @@ -1929,8 +1959,8 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct doc_special("bxor", {"x1", "x2", "..."}, "Bitwise XOR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") SPECIALS.bnot = function(ast, scope, parent) compiler.assert((#ast == 2), "expected one argument", ast) - local _528_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local value = _528_[1] + local _534_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local value = _534_[1] if utils.root.options.useBitLib then return ("bit.bnot(" .. tostring(value) .. ")") else @@ -1939,15 +1969,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end doc_special("bnot", {"x"}, "Bitwise negation; only works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") doc_special("..", {"a", "b", "..."}, "String concatenation operator; works the same as Lua but accepts more arguments.") - local function native_comparator(op, _530_0, scope, parent) - local _531_ = _530_0 - local _ = _531_[1] - local lhs_ast = _531_[2] - local rhs_ast = _531_[3] - local _532_ = compiler.compile1(lhs_ast, scope, parent, {nval = 1}) - local lhs = _532_[1] - local _533_ = compiler.compile1(rhs_ast, scope, parent, {nval = 1}) - local rhs = _533_[1] + local function native_comparator(op, _536_0, scope, parent) + local _537_ = _536_0 + local _ = _537_[1] + local lhs_ast = _537_[2] + local rhs_ast = _537_[3] + local _538_ = compiler.compile1(lhs_ast, scope, parent, {nval = 1}) + local lhs = _538_[1] + local _539_ = compiler.compile1(rhs_ast, scope, parent, {nval = 1}) + local rhs = _539_[1] return string.format("(%s %s %s)", tostring(lhs), op, tostring(rhs)) end local function idempotent_comparator(op, chain_op, ast, scope, parent) @@ -2060,21 +2090,21 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local safe_require = nil local function safe_compiler_env() - local _540_ + local _546_ do - local _539_0 = rawget(_G, "utf8") - if (nil ~= _539_0) then - _540_ = utils.copy(_539_0) + local _545_0 = rawget(_G, "utf8") + if (nil ~= _545_0) then + _546_ = utils.copy(_545_0) else - _540_ = _539_0 + _546_ = _545_0 end end - return {_VERSION = _VERSION, assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = utils.stablepairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, require = safe_require, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, utf8 = _540_, xpcall = xpcall} + return {_VERSION = _VERSION, assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = utils.stablepairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, require = safe_require, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, utf8 = _546_, xpcall = xpcall} end local function combined_mt_pairs(env) local combined = {} - local _542_ = getmetatable(env) - local __index = _542_["__index"] + local _548_ = getmetatable(env) + local __index = _548_["__index"] if ("table" == type(__index)) then for k, v in pairs(__index) do combined[k] = v @@ -2088,40 +2118,40 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function make_compiler_env(ast, scope, parent, _3fopts) local provided = nil do - local _544_0 = (_3fopts or utils.root.options) - if ((_G.type(_544_0) == "table") and (_544_0["compiler-env"] == "strict")) then + local _550_0 = (_3fopts or utils.root.options) + if ((_G.type(_550_0) == "table") and (_550_0["compiler-env"] == "strict")) then provided = safe_compiler_env() - elseif ((_G.type(_544_0) == "table") and (nil ~= _544_0.compilerEnv)) then - local compilerEnv = _544_0.compilerEnv + elseif ((_G.type(_550_0) == "table") and (nil ~= _550_0.compilerEnv)) then + local compilerEnv = _550_0.compilerEnv provided = compilerEnv - elseif ((_G.type(_544_0) == "table") and (nil ~= _544_0["compiler-env"])) then - local compiler_env = _544_0["compiler-env"] + elseif ((_G.type(_550_0) == "table") and (nil ~= _550_0["compiler-env"])) then + local compiler_env = _550_0["compiler-env"] provided = compiler_env else - local _ = _544_0 + local _ = _550_0 provided = safe_compiler_env() end end local env = nil - local function _546_() + local function _552_() return compiler.scopes.macro end - local function _547_(symbol) + local function _553_(symbol) compiler.assert(compiler.scopes.macro, "must call from macro", ast) return compiler.scopes.macro.manglings[tostring(symbol)] end - local function _548_(base) + local function _554_(base) return utils.sym(compiler.gensym((compiler.scopes.macro or scope), base)) end - local function _549_(form) + local function _555_(form) compiler.assert(compiler.scopes.macro, "must call from macro", ast) return compiler.macroexpand(form, compiler.scopes.macro) end - env = {["assert-compile"] = compiler.assert, ["ast-source"] = utils["ast-source"], ["comment?"] = utils["comment?"], ["get-scope"] = _546_, ["in-scope?"] = _547_, ["list?"] = utils["list?"], ["macro-loaded"] = macro_loaded, ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), comment = utils.comment, gensym = _548_, list = utils.list, macroexpand = _549_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, version = utils.version, view = view} + env = {["assert-compile"] = compiler.assert, ["ast-source"] = utils["ast-source"], ["comment?"] = utils["comment?"], ["fennel-module-name"] = fennel_module_name, ["get-scope"] = _552_, ["in-scope?"] = _553_, ["list?"] = utils["list?"], ["macro-loaded"] = macro_loaded, ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), comment = utils.comment, gensym = _554_, list = utils.list, macroexpand = _555_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, version = utils.version, view = view} env._G = env return setmetatable(env, {__index = provided, __newindex = provided, __pairs = combined_mt_pairs}) end - local function _550_(...) + local function _556_(...) local tbl_17_ = {} local i_18_ = #tbl_17_ for c in string.gmatch((package.config or ""), "([^\n]+)") do @@ -2133,10 +2163,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return tbl_17_ end - local _552_ = _550_(...) - local dirsep = _552_[1] - local pathsep = _552_[2] - local pathmark = _552_[3] + local _558_ = _556_(...) + local dirsep = _558_[1] + local pathsep = _558_[2] + local pathmark = _558_[3] local pkg_config = {dirsep = (dirsep or "/"), pathmark = (pathmark or "?"), pathsep = (pathsep or ";")} local function escapepat(str) return string.gsub(str, "[^%w]", "%%%1") @@ -2149,36 +2179,36 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function try_path(path) local filename = path:gsub(escapepat(pkg_config.pathmark), no_dot_module) local filename2 = path:gsub(escapepat(pkg_config.pathmark), modulename) - local _553_0 = (io.open(filename) or io.open(filename2)) - if (nil ~= _553_0) then - local file = _553_0 + local _559_0 = (io.open(filename) or io.open(filename2)) + if (nil ~= _559_0) then + local file = _559_0 file:close() return filename else - local _ = _553_0 + local _ = _559_0 return nil, ("no file '" .. filename .. "'") end end local function find_in_path(start, _3ftried_paths) - local _555_0 = fullpath:match(pattern, start) - if (nil ~= _555_0) then - local path = _555_0 - local _556_0, _557_0 = try_path(path) - if (nil ~= _556_0) then - local filename = _556_0 + local _561_0 = fullpath:match(pattern, start) + if (nil ~= _561_0) then + local path = _561_0 + local _562_0, _563_0 = try_path(path) + if (nil ~= _562_0) then + local filename = _562_0 return filename - elseif ((_556_0 == nil) and (nil ~= _557_0)) then - local error = _557_0 - local function _559_() - local _558_0 = (_3ftried_paths or {}) - table.insert(_558_0, error) - return _558_0 + elseif ((_562_0 == nil) and (nil ~= _563_0)) then + local error = _563_0 + local function _565_() + local _564_0 = (_3ftried_paths or {}) + table.insert(_564_0, error) + return _564_0 end - return find_in_path((start + #path + 1), _559_()) + return find_in_path((start + #path + 1), _565_()) end else - local _ = _555_0 - local function _561_() + local _ = _561_0 + local function _567_() local tried_paths = table.concat((_3ftried_paths or {}), "\n\9") if (_VERSION < "Lua 5.4") then return ("\n\9" .. tried_paths) @@ -2186,31 +2216,31 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return tried_paths end end - return nil, _561_() + return nil, _567_() end end return find_in_path(1) end local function make_searcher(_3foptions) - local function _564_(module_name) + local function _570_(module_name) local opts = utils.copy(utils.root.options) for k, v in pairs((_3foptions or {})) do opts[k] = v end opts["module-name"] = module_name - local _565_0, _566_0 = search_module(module_name) - if (nil ~= _565_0) then - local filename = _565_0 - local function _567_(...) + local _571_0, _572_0 = search_module(module_name) + if (nil ~= _571_0) then + local filename = _571_0 + local function _573_(...) return utils["fennel-module"].dofile(filename, opts, ...) end - return _567_, filename - elseif ((_565_0 == nil) and (nil ~= _566_0)) then - local error = _566_0 + return _573_, filename + elseif ((_571_0 == nil) and (nil ~= _572_0)) then + local error = _572_0 return error end end - return _564_ + return _570_ end local function dofile_with_searcher(fennel_macro_searcher, filename, opts, ...) local searchers = (package.loaders or package.searchers or {}) @@ -2222,35 +2252,35 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function fennel_macro_searcher(module_name) local opts = nil do - local _569_0 = utils.copy(utils.root.options) - _569_0["module-name"] = module_name - _569_0["env"] = "_COMPILER" - _569_0["requireAsInclude"] = false - _569_0["allowedGlobals"] = nil - opts = _569_0 + local _575_0 = utils.copy(utils.root.options) + _575_0["module-name"] = module_name + _575_0["env"] = "_COMPILER" + _575_0["requireAsInclude"] = false + _575_0["allowedGlobals"] = nil + opts = _575_0 end - local _570_0 = search_module(module_name, utils["fennel-module"]["macro-path"]) - if (nil ~= _570_0) then - local filename = _570_0 - local _571_ + local _576_0 = search_module(module_name, utils["fennel-module"]["macro-path"]) + if (nil ~= _576_0) then + local filename = _576_0 + local _577_ if (opts["compiler-env"] == _G) then - local function _572_(...) + local function _578_(...) return dofile_with_searcher(fennel_macro_searcher, filename, opts, ...) end - _571_ = _572_ + _577_ = _578_ else - local function _573_(...) + local function _579_(...) return utils["fennel-module"].dofile(filename, opts, ...) end - _571_ = _573_ + _577_ = _579_ end - return _571_, filename + return _577_, filename end end local function lua_macro_searcher(module_name) - local _576_0 = search_module(module_name, package.path) - if (nil ~= _576_0) then - local filename = _576_0 + local _582_0 = search_module(module_name, package.path) + if (nil ~= _582_0) then + local filename = _582_0 local code = nil do local f = io.open(filename) @@ -2262,10 +2292,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return error(..., 0) end end - local function _578_() + local function _584_() return assert(f:read("*a")) end - code = close_handlers_10_(_G.xpcall(_578_, (package.loaded.fennel or debug).traceback)) + code = close_handlers_10_(_G.xpcall(_584_, (package.loaded.fennel or debug).traceback)) end local chunk = load_code(code, make_compiler_env(), filename) return chunk, filename @@ -2273,38 +2303,38 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local macro_searchers = {fennel_macro_searcher, lua_macro_searcher} local function search_macro_module(modname, n) - local _580_0 = macro_searchers[n] - if (nil ~= _580_0) then - local f = _580_0 - local _581_0, _582_0 = f(modname) - if ((nil ~= _581_0) and true) then - local loader = _581_0 - local _3ffilename = _582_0 + local _586_0 = macro_searchers[n] + if (nil ~= _586_0) then + local f = _586_0 + local _587_0, _588_0 = f(modname) + if ((nil ~= _587_0) and true) then + local loader = _587_0 + local _3ffilename = _588_0 return loader, _3ffilename else - local _ = _581_0 + local _ = _587_0 return search_macro_module(modname, (n + 1)) end end end local function sandbox_fennel_module(modname) if ((modname == "fennel.macros") or (package and package.loaded and ("table" == type(package.loaded[modname])) and (package.loaded[modname].metadata == compiler.metadata))) then - local function _585_(_, ...) + local function _591_(_, ...) return (compiler.metadata):setall(...) end - return {metadata = {setall = _585_}, view = view} + return {metadata = {setall = _591_}, view = view} end end - local function _587_(modname) - local function _588_() + local function _593_(modname) + local function _594_() local loader, filename = search_macro_module(modname, 1) compiler.assert(loader, (modname .. " module not found.")) macro_loaded[modname] = loader(modname, filename) return macro_loaded[modname] end - return (macro_loaded[modname] or sandbox_fennel_module(modname) or _588_()) + return (macro_loaded[modname] or sandbox_fennel_module(modname) or _594_()) end - safe_require = _587_ + safe_require = _593_ local function add_macros(macros_2a, ast, scope) compiler.assert(utils["table?"](macros_2a), "expected macros to be table", ast) for k, v in pairs(macros_2a) do @@ -2314,10 +2344,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return nil end - local function resolve_module_name(_589_0, _scope, _parent, opts) - local _590_ = _589_0 - local second = _590_[2] - local filename = _590_["filename"] + local function resolve_module_name(_595_0, _scope, _parent, opts) + local _596_ = _595_0 + local second = _596_[2] + local filename = _596_["filename"] local filename0 = (filename or (utils["table?"](second) and second.filename)) local module_name = utils.root.options["module-name"] local modexpr = compiler.compile(second, opts) @@ -2374,10 +2404,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return error(..., 0) end end - local function _596_() + local function _602_() return assert(f:read("*all")):gsub("[\13\n]*$", "") end - src = close_handlers_10_(_G.xpcall(_596_, (package.loaded.fennel or debug).traceback)) + src = close_handlers_10_(_G.xpcall(_602_, (package.loaded.fennel or debug).traceback)) end local ret = utils.expr(("require(\"" .. mod .. "\")"), "statement") local target = ("package.preload[%q]"):format(mod) @@ -2407,12 +2437,12 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.assert((#ast == 2), "expected one argument", ast) local modexpr = nil do - local _599_0, _600_0 = pcall(resolve_module_name, ast, scope, parent, opts) - if ((_599_0 == true) and (nil ~= _600_0)) then - local modname = _600_0 + local _605_0, _606_0 = pcall(resolve_module_name, ast, scope, parent, opts) + if ((_605_0 == true) and (nil ~= _606_0)) then + local modname = _606_0 modexpr = utils.expr(string.format("%q", modname), "literal") else - local _ = _599_0 + local _ = _605_0 modexpr = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] end end @@ -2429,13 +2459,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct utils.root.options["module-name"] = mod _ = nil local res = nil - local function _604_() - local _603_0 = search_module(mod) - if (nil ~= _603_0) then - local fennel_path = _603_0 + local function _610_() + local _609_0 = search_module(mod) + if (nil ~= _609_0) then + local fennel_path = _609_0 return include_path(ast, opts, fennel_path, mod, true) else - local _0 = _603_0 + local _0 = _609_0 local lua_path = search_module(mod, package.path) if lua_path then return include_path(ast, opts, lua_path, mod, false) @@ -2446,7 +2476,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end end - res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and opts.fallback(modexpr, true)) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _604_()) + res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and opts.fallback(modexpr, true)) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _610_()) utils.root.options["module-name"] = oldmod return res end @@ -2466,9 +2496,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return add_macros(macro_tbl, ast, scope) end doc_special("macros", {"{:macro-name-1 (fn [...] ...) ... :macro-name-N macro-body-N}"}, "Define all functions in the given table as macros local to the current scope.") - SPECIALS["tail!"] = function(ast, scope, _parent, _608_0) - local _609_ = _608_0 - local tail = _609_["tail"] + SPECIALS["tail!"] = function(ast, scope, _parent, _614_0) + local _615_ = _614_0 + local tail = _615_["tail"] compiler.assert((#ast == 2), "Expected one argument", ast) compiler.assert(utils["list?"](ast[2]), "Expected a call as argument", ast) compiler.assert(tail, "Must be in tail position", ast) @@ -2487,23 +2517,23 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return compiler.assert(false, "tried to use unquote outside quote", ast) end doc_special("unquote", {"..."}, "Evaluate the argument even if it's in a quoted form.") - return {["current-global-names"] = current_global_names, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} + return {["current-global-names"] = current_global_names, ["get-function-metadata"] = get_function_metadata, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} end package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or function(...) local utils = require("fennel.utils") local parser = require("fennel.parser") local friend = require("fennel.friend") local unpack = (table.unpack or _G.unpack) - local scopes = {} + local scopes = {compiler = nil, global = nil, macro = nil} local function make_scope(_3fparent) local parent = (_3fparent or scopes.global) - local _261_ + local _264_ if parent then - _261_ = ((parent.depth or 0) + 1) + _264_ = ((parent.depth or 0) + 1) else - _261_ = 0 + _264_ = 0 end - return {["gensym-base"] = setmetatable({}, {__index = (parent and parent["gensym-base"])}), autogensyms = setmetatable({}, {__index = (parent and parent.autogensyms)}), depth = _261_, gensyms = setmetatable({}, {__index = (parent and parent.gensyms)}), hashfn = (parent and parent.hashfn), includes = setmetatable({}, {__index = (parent and parent.includes)}), macros = setmetatable({}, {__index = (parent and parent.macros)}), manglings = setmetatable({}, {__index = (parent and parent.manglings)}), parent = parent, refedglobals = {}, specials = setmetatable({}, {__index = (parent and parent.specials)}), symmeta = setmetatable({}, {__index = (parent and parent.symmeta)}), unmanglings = setmetatable({}, {__index = (parent and parent.unmanglings)}), vararg = (parent and parent.vararg)} + return {["gensym-base"] = setmetatable({}, {__index = (parent and parent["gensym-base"])}), autogensyms = setmetatable({}, {__index = (parent and parent.autogensyms)}), depth = _264_, gensyms = setmetatable({}, {__index = (parent and parent.gensyms)}), hashfn = (parent and parent.hashfn), includes = setmetatable({}, {__index = (parent and parent.includes)}), macros = setmetatable({}, {__index = (parent and parent.macros)}), manglings = setmetatable({}, {__index = (parent and parent.manglings)}), parent = parent, refedglobals = {}, specials = setmetatable({}, {__index = (parent and parent.specials)}), symmeta = setmetatable({}, {__index = (parent and parent.symmeta)}), unmanglings = setmetatable({}, {__index = (parent and parent.unmanglings)}), vararg = (parent and parent.vararg)} end local function assert_msg(ast, msg) local ast_tbl = nil @@ -2517,14 +2547,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local line = ((m and m.line) or ast_tbl.line or "?") local col = ((m and m.col) or ast_tbl.col or "?") local target = tostring((utils["sym?"](ast_tbl[1]) or ast_tbl[1] or "()")) - return string.format("%s:%s:%s Compile error in '%s': %s", filename, line, col, target, msg) + return string.format("%s:%s:%s: Compile error in '%s': %s", filename, line, col, target, msg) end local function assert_compile(condition, msg, ast, _3ffallback_ast) if not condition then - local _264_ = (utils.root.options or {}) - local error_pinpoint = _264_["error-pinpoint"] - local source = _264_["source"] - local unfriendly = _264_["unfriendly"] + local _267_ = (utils.root.options or {}) + local error_pinpoint = _267_["error-pinpoint"] + local source = _267_["source"] + local unfriendly = _267_["unfriendly"] local ast0 = nil if next(utils["ast-source"](ast)) then ast0 = ast @@ -2548,33 +2578,33 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct scopes.macro = scopes.global local serialize_subst = {["\11"] = "\\v", ["\12"] = "\\f", ["\7"] = "\\a", ["\8"] = "\\b", ["\9"] = "\\t", ["\n"] = "n"} local function serialize_string(str) - local function _269_(_241) + local function _272_(_241) return ("\\" .. _241:byte()) end - return string.gsub(string.gsub(string.format("%q", str), ".", serialize_subst), "[\128-\255]", _269_) + return string.gsub(string.gsub(string.format("%q", str), ".", serialize_subst), "[\128-\255]", _272_) end local function global_mangling(str) if utils["valid-lua-identifier?"](str) then return str else - local function _270_(_241) + local function _273_(_241) return string.format("_%02x", _241:byte()) end - return ("__fnl_global__" .. str:gsub("[^%w]", _270_)) + return ("__fnl_global__" .. str:gsub("[^%w]", _273_)) end end local function global_unmangling(identifier) - local _272_0 = string.match(identifier, "^__fnl_global__(.*)$") - if (nil ~= _272_0) then - local rest = _272_0 - local _273_0 = nil - local function _274_(_241) + local _275_0 = string.match(identifier, "^__fnl_global__(.*)$") + if (nil ~= _275_0) then + local rest = _275_0 + local _276_0 = nil + local function _277_(_241) return string.char(tonumber(_241:sub(2), 16)) end - _273_0 = string.gsub(rest, "_[%da-f][%da-f]", _274_) - return _273_0 + _276_0 = string.gsub(rest, "_[%da-f][%da-f]", _277_) + return _276_0 else - local _ = _272_0 + local _ = _275_0 return identifier end end @@ -2598,10 +2628,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct raw = str end local mangling = nil - local function _278_(_241) + local function _281_(_241) return string.format("_%02x", _241:byte()) end - mangling = string.gsub(string.gsub(raw, "-", "_"), "[^%w_]", _278_) + mangling = string.gsub(string.gsub(raw, "-", "_"), "[^%w_]", _281_) local unique = unique_mangling(mangling, mangling, scope, 0) scope.unmanglings[unique] = (scope["gensym-base"][str] or str) do @@ -2656,31 +2686,31 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return table.concat(parts, ".") end local function autogensym(base, scope) - local _282_0 = utils["multi-sym?"](base) - if (nil ~= _282_0) then - local parts = _282_0 + local _285_0 = utils["multi-sym?"](base) + if (nil ~= _285_0) then + local parts = _285_0 return combine_auto_gensym(parts, autogensym(parts[1], scope)) else - local _ = _282_0 - local function _283_() + local _ = _285_0 + local function _286_() local mangling = gensym(scope, base:sub(1, -2), "auto") scope.autogensyms[base] = mangling return mangling end - return (scope.autogensyms[base] or _283_()) + return (scope.autogensyms[base] or _286_()) end end local function check_binding_valid(symbol, scope, ast, _3fopts) local name = tostring(symbol) local macro_3f = nil do - local _285_0 = _3fopts - if (nil ~= _285_0) then - _285_0 = _285_0["macro?"] + local _288_0 = _3fopts + if (nil ~= _288_0) then + _288_0 = _288_0["macro?"] end - macro_3f = _285_0 + macro_3f = _288_0 end - assert_compile(not name:find("&"), "invalid character: &", symbol) + assert_compile(("&" ~= name:match("[&.:]")), "invalid character: &", symbol) assert_compile(not name:find("^%."), "invalid character: .", symbol) assert_compile(not (scope.specials[name] or (not macro_3f and scope.macros[name])), ("local %s was overshadowed by a special form or macro"):format(name), ast) return assert_compile(not utils["quoted?"](symbol), string.format("macro tried to bind %s without gensym", name), symbol) @@ -2776,22 +2806,22 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function flatten_chunk(file_sourcemap, chunk, tab, depth) if chunk.leaf then - local _297_ = utils["ast-source"](chunk.ast) - local filename = _297_["filename"] - local line = _297_["line"] + local _300_ = utils["ast-source"](chunk.ast) + local filename = _300_["filename"] + local line = _300_["line"] table.insert(file_sourcemap, {filename, line}) return chunk.leaf else local tab0 = nil do - local _298_0 = tab - if (_298_0 == true) then + local _301_0 = tab + if (_301_0 == true) then tab0 = " " - elseif (_298_0 == false) then + elseif (_301_0 == false) then tab0 = "" - elseif (_298_0 == tab) then + elseif (_301_0 == tab) then tab0 = tab - elseif (_298_0 == nil) then + elseif (_301_0 == nil) then tab0 = "" else tab0 = nil @@ -2837,7 +2867,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function make_metadata() - local function _306_(self, tgt, _3fkey) + local function _309_(self, tgt, _3fkey) if self[tgt] then if (nil ~= _3fkey) then return self[tgt][_3fkey] @@ -2846,12 +2876,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end end - local function _309_(self, tgt, key, value) + local function _312_(self, tgt, key, value) self[tgt] = (self[tgt] or {}) self[tgt][key] = value return tgt end - local function _310_(self, tgt, ...) + local function _313_(self, tgt, ...) local kv_len = select("#", ...) local kvs = {...} if ((kv_len % 2) ~= 0) then @@ -2863,7 +2893,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end return tgt end - return setmetatable({}, {__index = {get = _306_, set = _309_, setall = _310_}, __mode = "k"}) + return setmetatable({}, {__index = {get = _309_, set = _312_, setall = _313_}, __mode = "k"}) end local function exprs1(exprs) return table.concat(utils.map(exprs, tostring), ", ") @@ -2909,14 +2939,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end if opts.target then local result = exprs1(exprs) - local function _318_() + local function _321_() if (result == "") then return "nil" else return result end end - emit(parent, string.format("%s = %s", opts.target, _318_()), ast) + emit(parent, string.format("%s = %s", opts.target, _321_()), ast) end if (opts.tail or opts.target) then return {returned = true} @@ -2928,16 +2958,16 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function find_macro(ast, scope) local macro_2a = nil do - local _321_0 = utils["sym?"](ast[1]) - if (_321_0 ~= nil) then - local _322_0 = tostring(_321_0) - if (_322_0 ~= nil) then - macro_2a = scope.macros[_322_0] + local _324_0 = utils["sym?"](ast[1]) + if (_324_0 ~= nil) then + local _325_0 = tostring(_324_0) + if (_325_0 ~= nil) then + macro_2a = scope.macros[_325_0] else - macro_2a = _322_0 + macro_2a = _325_0 end else - macro_2a = _321_0 + macro_2a = _324_0 end end local multi_sym_parts = utils["multi-sym?"](ast[1]) @@ -2949,12 +2979,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return macro_2a end end - local function propagate_trace_info(_326_0, _index, node) - local _327_ = _326_0 - local byteend = _327_["byteend"] - local bytestart = _327_["bytestart"] - local filename = _327_["filename"] - local line = _327_["line"] + local function propagate_trace_info(_329_0, _index, node) + local _330_ = _329_0 + local byteend = _330_["byteend"] + local bytestart = _330_["bytestart"] + local filename = _330_["filename"] + local line = _330_["line"] do local src = utils["ast-source"](node) if (("table" == type(node)) and (filename ~= src.filename)) then @@ -2967,8 +2997,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function quote_literal_nils(index, node, parent) if (parent and utils["list?"](parent)) then for i = 1, utils.maxn(parent) do - local _329_0 = parent[i] - if (_329_0 == nil) then + local _332_0 = parent[i] + if (_332_0 == nil) then parent[i] = utils.sym("nil") end end @@ -2976,10 +3006,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return index, node, parent end local function comp(f, g) - local function _332_(...) + local function _335_(...) return f(g(...)) end - return _332_ + return _335_ end local function built_in_3f(m) local found_3f = false @@ -2990,45 +3020,46 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return found_3f end local function macroexpand_2a(ast, scope, _3fonce) - local _333_0 = nil + local _336_0 = nil if utils["list?"](ast) then - _333_0 = find_macro(ast, scope) + _336_0 = find_macro(ast, scope) else - _333_0 = nil + _336_0 = nil end - if (_333_0 == false) then + if (_336_0 == false) then return ast - elseif (nil ~= _333_0) then - local macro_2a = _333_0 + elseif (nil ~= _336_0) then + local macro_2a = _336_0 local old_scope = scopes.macro local _ = nil scopes.macro = scope _ = nil local ok, transformed = nil, nil - local function _335_() + local function _338_() return macro_2a(unpack(ast, 2)) end - local function _336_() + local function _339_() if built_in_3f(macro_2a) then return tostring else return debug.traceback end end - ok, transformed = xpcall(_335_, _336_()) - local function _337_(...) + ok, transformed = xpcall(_338_, _339_()) + local function _340_(...) return propagate_trace_info(ast, ...) end - utils["walk-tree"](transformed, comp(_337_, quote_literal_nils)) + utils["walk-tree"](transformed, comp(_340_, quote_literal_nils)) scopes.macro = old_scope assert_compile(ok, transformed, ast) + utils.hook("macroexpand", ast, transformed, scope) if (_3fonce or not transformed) then return transformed else return macroexpand_2a(transformed, scope) end else - local _ = _333_0 + local _ = _336_0 return ast end end @@ -3060,13 +3091,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct assert_compile((utils["sym?"](ast[1]) or utils["list?"](ast[1]) or ("string" == type(ast[1]))), ("cannot call literal value " .. tostring(ast[1])), ast) for i = 2, len do local subexprs = nil - local _343_ + local _346_ if (i ~= len) then - _343_ = 1 + _346_ = 1 else - _343_ = nil + _346_ = nil end - subexprs = compile1(ast[i], scope, parent, {nval = _343_}) + subexprs = compile1(ast[i], scope, parent, {nval = _346_}) table.insert(fargs, subexprs[1]) if (i == len) then for j = 2, #subexprs do @@ -3104,13 +3135,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function compile_varg(ast, scope, parent, opts) - local _348_ + local _351_ if scope.hashfn then - _348_ = "use $... in hashfn" + _351_ = "use $... in hashfn" else - _348_ = "unexpected vararg" + _351_ = "unexpected vararg" end - assert_compile(scope.vararg, _348_, ast) + assert_compile(scope.vararg, _351_, ast) return handle_compile_opts({utils.expr("...", "varg")}, parent, opts, ast) end local function compile_sym(ast, scope, parent, opts) @@ -3125,20 +3156,20 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return handle_compile_opts({e}, parent, opts, ast) end local function serialize_number(n) - local _351_0 = string.gsub(tostring(n), ",", ".") - return _351_0 + local _354_0 = string.gsub(tostring(n), ",", ".") + return _354_0 end local function compile_scalar(ast, _scope, parent, opts) local serialize = nil do - local _352_0 = type(ast) - if (_352_0 == "nil") then + local _355_0 = type(ast) + if (_355_0 == "nil") then serialize = tostring - elseif (_352_0 == "boolean") then + elseif (_355_0 == "boolean") then serialize = tostring - elseif (_352_0 == "string") then + elseif (_355_0 == "string") then serialize = serialize_string - elseif (_352_0 == "number") then + elseif (_355_0 == "number") then serialize = serialize_number else serialize = nil @@ -3151,8 +3182,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if ((type(k) == "string") and utils["valid-lua-identifier?"](k)) then return k else - local _354_ = compile1(k, scope, parent, {nval = 1}) - local compiled = _354_[1] + local _357_ = compile1(k, scope, parent, {nval = 1}) + local compiled = _357_[1] return ("[" .. tostring(compiled) .. "]") end end @@ -3181,8 +3212,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct for k in utils.stablepairs(ast) do local val_19_ = nil if not keys[k] then - local _357_ = compile1(ast[k], scope, parent, {nval = 1}) - local v = _357_[1] + local _360_ = compile1(ast[k], scope, parent, {nval = 1}) + local v = _360_[1] val_19_ = string.format("%s = %s", escape_key(k), tostring(v)) else val_19_ = nil @@ -3214,12 +3245,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function destructure(to, from, ast, scope, parent, opts) local opts0 = (opts or {}) - local _361_ = opts0 - local declaration = _361_["declaration"] - local forceglobal = _361_["forceglobal"] - local forceset = _361_["forceset"] - local isvar = _361_["isvar"] - local symtype = _361_["symtype"] + local _364_ = opts0 + local declaration = _364_["declaration"] + local forceglobal = _364_["forceglobal"] + local forceset = _364_["forceset"] + local isvar = _364_["isvar"] + local symtype = _364_["symtype"] local symtype0 = ("_" .. (symtype or "dst")) local setter = nil if declaration then @@ -3235,8 +3266,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return declare_local(symbol, nil, scope, symbol, new_manglings) else local parts = (utils["multi-sym?"](raw) or {raw}) - local _363_ = parts - local first = _363_[1] + local _366_ = parts + local first = _366_[1] local meta = scope.symmeta[first] assert_compile(not raw:find(":"), "cannot set method sym", symbol) if ((#parts == 1) and not forceset) then @@ -3257,14 +3288,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function compile_top_target(lvalues) local inits = nil - local function _368_(_241) + local function _371_(_241) if scope.manglings[_241] then return _241 else return "nil" end end - inits = utils.map(lvalues, _368_) + inits = utils.map(lvalues, _371_) local init = table.concat(inits, ", ") local lvalue = table.concat(lvalues, ", ") local plast = parent[#parent] @@ -3302,7 +3333,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local unpack_fn = "function (t, k, e)\n local mt = getmetatable(t)\n if 'table' == type(mt) and mt.__fennelrest then\n return mt.__fennelrest(t, k)\n elseif e then\n local rest = {}\n for k, v in pairs(t) do\n if not e[k] then rest[k] = v end\n end\n return rest\n else\n return {(table.unpack or unpack)(t, k)}\n end\n end" local function destructure_kv_rest(s, v, left, excluded_keys, destructure1) local exclude_str = nil - local _375_ + local _378_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -3313,9 +3344,9 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct tbl_17_[i_18_] = val_19_ end end - _375_ = tbl_17_ + _378_ = tbl_17_ end - exclude_str = table.concat(_375_, ", ") + exclude_str = table.concat(_378_, ", ") local subexpr = utils.expr(string.format(string.gsub(("(" .. unpack_fn .. ")(%s, %s, {%s})"), "\n%s*", " "), s, tostring(v), exclude_str), "expression") return destructure1(v, {subexpr}, left) end @@ -3330,16 +3361,16 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local s = gensym(scope, symtype0) local right = nil do - local _377_0 = nil + local _380_0 = nil if top_3f then - _377_0 = exprs1(compile1(from, scope, parent)) + _380_0 = exprs1(compile1(from, scope, parent)) else - _377_0 = exprs1(rightexprs) + _380_0 = exprs1(rightexprs) end - if (_377_0 == "") then + if (_380_0 == "") then right = "nil" - elseif (nil ~= _377_0) then - local right0 = _377_0 + elseif (nil ~= _380_0) then + local right0 = _380_0 right = right0 else right = nil @@ -3424,7 +3455,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function require_include(ast, scope, parent, opts) opts.fallback = function(e, no_warn) if (not no_warn and ("literal" == e.type)) then - utils.warn(("include module not found, falling back to require: %s"):format(tostring(e))) + utils.warn(("include module not found, falling back to require: %s"):format(tostring(e)), ast) end return utils.expr(string.format("require(%s)", tostring(e)), "statement") end @@ -3447,8 +3478,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if opts.assertAsRepl then scope.macros.assert = scope.macros["assert-repl"] end - local _392_ = utils.root - _392_["set-reset"](_392_) + local _395_ = utils.root + _395_["set-reset"](_395_) utils.root.chunk, utils.root.scope, utils.root.options = chunk, scope, opts for i = 1, #asts do local exprs = compile1(asts[i], scope, chunk, {nval = (((i < #asts) and 0) or nil), tail = (i == #asts)}) @@ -3461,7 +3492,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct utils.root.reset() return flatten(chunk, opts) end - local function compile_stream(stream, opts) + local function compile_stream(stream, _3fopts) + local opts = (_3fopts or {}) local asts = nil do local tbl_17_ = {} @@ -3478,16 +3510,16 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return compile_asts(asts, opts) end local function compile_string(str, _3fopts) - return compile_stream(parser["string-stream"](str, (_3fopts or {})), (_3fopts or {})) + return compile_stream(parser["string-stream"](str, _3fopts), _3fopts) end local function compile(ast, _3fopts) return compile_asts({ast}, _3fopts) end local function traceback_frame(info) if ((info.what == "C") and info.name) then - return string.format(" [C]: in function '%s'", info.name) + return string.format("\9[C]: in function '%s'", info.name) elseif (info.what == "C") then - return " [C]: in ?" + return "\9[C]: in ?" else local remap = sourcemap[info.source] if (remap and remap[info.currentline]) then @@ -3499,18 +3531,18 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct info.currentline = (remap[info.currentline][2] or -1) end if (info.what == "Lua") then - local function _397_() + local function _400_() if info.name then return ("'" .. info.name .. "'") else return "?" end end - return string.format(" %s:%d: in function %s", info.short_src, info.currentline, _397_()) + return string.format("\9%s:%d: in function %s", info.short_src, info.currentline, _400_()) elseif (info.short_src == "(tail call)") then return " (tail call)" else - return string.format(" %s:%d: in main chunk", info.short_src, info.currentline) + return string.format("\9%s:%d: in main chunk", info.short_src, info.currentline) end end end @@ -3530,11 +3562,11 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local done_3f, level = false, (_3fstart or 2) while not done_3f do do - local _401_0 = debug.getinfo(level, "Sln") - if (_401_0 == nil) then + local _404_0 = debug.getinfo(level, "Sln") + if (_404_0 == nil) then done_3f = true - elseif (nil ~= _401_0) then - local info = _401_0 + elseif (nil ~= _404_0) then + local info = _404_0 table.insert(lines, traceback_frame(info)) end end @@ -3544,14 +3576,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function entry_transform(fk, fv) - local function _404_(k, v) + local function _407_(k, v) if (type(k) == "number") then return k, fv(v) else return fk(k), fv(v) end end - return _404_ + return _407_ end local function mixed_concat(t, joiner) local seen = {} @@ -3596,10 +3628,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return res[1] elseif utils["list?"](form) then local mapped = nil - local function _409_() + local function _412_() return nil end - mapped = utils.kvmap(form, entry_transform(_409_, q)) + mapped = utils.kvmap(form, entry_transform(_412_, q)) local filename = nil if form.filename then filename = string.format("%q", form.filename) @@ -3617,13 +3649,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else filename = "nil" end - local _412_ + local _415_ if source then - _412_ = source.line + _415_ = source.line else - _412_ = "nil" + _415_ = "nil" end - return string.format("setmetatable({%s}, {filename=%s, line=%s, sequence=%s})", mixed_concat(mapped, ", "), filename, _412_, "(getmetatable(sequence()))['sequence']") + return string.format("setmetatable({%s}, {filename=%s, line=%s, sequence=%s})", mixed_concat(mapped, ", "), filename, _415_, "(getmetatable(sequence()))['sequence']") elseif (type(form) == "table") then local mapped = utils.kvmap(form, entry_transform(q, q)) local source = getmetatable(form) @@ -3633,14 +3665,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else filename = "nil" end - local function _415_() + local function _418_() if source then return source.line else return "nil" end end - return string.format("setmetatable({%s}, {filename=%s, line=%s})", mixed_concat(mapped, ", "), filename, _415_()) + return string.format("setmetatable({%s}, {filename=%s, line=%s})", mixed_concat(mapped, ", "), filename, _418_()) elseif (type(form) == "string") then return serialize_string(form) else @@ -3693,13 +3725,13 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( return error(..., 0) end end - local function _184_() + local function _187_() for _ = 2, line do f:read() end return f:read() end - return close_handlers_10_(_G.xpcall(_184_, (package.loaded.fennel or debug).traceback)) + return close_handlers_10_(_G.xpcall(_187_, (package.loaded.fennel or debug).traceback)) end end local function sub(str, start, _end) @@ -3715,8 +3747,8 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( if ((opts and (false == opts["error-pinpoint"])) or (os and os.getenv and os.getenv("NO_COLOR"))) then return codeline else - local _187_ = (opts or {}) - local error_pinpoint = _187_["error-pinpoint"] + local _190_ = (opts or {}) + local error_pinpoint = _190_["error-pinpoint"] local endcol = (_3fendcol or col) local eol = nil if utf8_ok_3f then @@ -3724,19 +3756,19 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( else eol = string.len(codeline) end - local _189_ = (error_pinpoint or {"\27[7m", "\27[0m"}) - local open = _189_[1] - local close = _189_[2] + local _192_ = (error_pinpoint or {"\27[7m", "\27[0m"}) + local open = _192_[1] + local close = _192_[2] return (sub(codeline, 1, col) .. open .. sub(codeline, (col + 1), (endcol + 1)) .. close .. sub(codeline, (endcol + 2), eol)) end end - local function friendly_msg(msg, _191_0, source, opts) - local _192_ = _191_0 - local col = _192_["col"] - local endcol = _192_["endcol"] - local endline = _192_["endline"] - local filename = _192_["filename"] - local line = _192_["line"] + local function friendly_msg(msg, _194_0, source, opts) + local _195_ = _194_0 + local col = _195_["col"] + local endcol = _195_["endcol"] + local endline = _195_["endline"] + local filename = _195_["filename"] + local line = _195_["line"] local ok, codeline = pcall(read_line, filename, line, source) local endcol0 = nil if (ok and codeline and (line ~= endline)) then @@ -3759,16 +3791,16 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( end local function assert_compile(condition, msg, ast, source, opts) if not condition then - local _196_ = utils["ast-source"](ast) - local col = _196_["col"] - local filename = _196_["filename"] - local line = _196_["line"] - error(friendly_msg(("%s:%s:%s Compile error: %s"):format((filename or "unknown"), (line or "?"), (col or "?"), msg), utils["ast-source"](ast), source, opts), 0) + local _199_ = utils["ast-source"](ast) + local col = _199_["col"] + local filename = _199_["filename"] + local line = _199_["line"] + error(friendly_msg(("%s:%s:%s: Compile error: %s"):format((filename or "unknown"), (line or "?"), (col or "?"), msg), utils["ast-source"](ast), source, opts), 0) end return condition end local function parse_error(msg, filename, line, col, source, opts) - return error(friendly_msg(("%s:%s:%s Parse error: %s"):format(filename, line, col, msg), {col = col, filename = filename, line = line}, source, opts), 0) + return error(friendly_msg(("%s:%s:%s: Parse error: %s"):format(filename, line, col, msg), {col = col, filename = filename, line = line}, source, opts), 0) end return {["assert-compile"] = assert_compile, ["parse-error"] = parse_error} end @@ -3778,36 +3810,36 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local unpack = (table.unpack or _G.unpack) local function granulate(getchunk) local c, index, done_3f = "", 1, false - local function _198_(parser_state) + local function _201_(parser_state) if not done_3f then if (index <= #c) then local b = c:byte(index) index = (index + 1) return b else - local _199_0 = getchunk(parser_state) - local function _200_() - local char = _199_0 + local _202_0 = getchunk(parser_state) + local function _203_() + local char = _202_0 return (char ~= "") end - if ((nil ~= _199_0) and _200_()) then - local char = _199_0 + if ((nil ~= _202_0) and _203_()) then + local char = _202_0 c = char index = 2 return c:byte() else - local _ = _199_0 + local _ = _202_0 done_3f = true return nil end end end end - local function _204_() + local function _207_() c = "" return nil end - return _198_, _204_ + return _201_, _207_ end local function string_stream(str, _3foptions) local str0 = str:gsub("^#!", ";;") @@ -3815,12 +3847,12 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( _3foptions.source = str0 end local index = 1 - local function _206_() + local function _209_() local r = str0:byte(index) index = (index + 1) return r end - return _206_ + return _209_ end local delims = {[123] = 125, [125] = true, [40] = 41, [41] = true, [91] = 93, [93] = true} local function sym_char_3f(b) @@ -3836,12 +3868,12 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local function char_starter_3f(b) return (((1 < b) and (b < 127)) or ((192 < b) and (b < 247))) end - local function parser_fn(getbyte, filename, _208_0) - local _209_ = _208_0 - local options = _209_ - local comments = _209_["comments"] - local source = _209_["source"] - local unfriendly = _209_["unfriendly"] + local function parser_fn(getbyte, filename, _211_0) + local _212_ = _211_0 + local options = _212_ + local comments = _212_["comments"] + local source = _212_["source"] + local unfriendly = _212_["unfriendly"] local stack = {} local line, byteindex, col, prev_col, lastb = 1, 0, 0, 0, nil local function ungetb(ub) @@ -3874,21 +3906,21 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return r end local function whitespace_3f(b) - local function _217_() - local _216_0 = options.whitespace - if (nil ~= _216_0) then - _216_0 = _216_0[b] + local function _220_() + local _219_0 = options.whitespace + if (nil ~= _219_0) then + _219_0 = _219_0[b] end - return _216_0 + return _219_0 end - return ((b == 32) or ((9 <= b) and (b <= 13)) or _217_()) + return ((b == 32) or ((9 <= b) and (b <= 13)) or _220_()) end local function parse_error(msg, _3fcol_adjust) local col0 = (col + (_3fcol_adjust or -1)) if (nil == utils["hook-opts"]("parse-error", options, msg, filename, (line or "?"), col0, source, utils.root.reset)) then utils.root.reset() if unfriendly then - return error(string.format("%s:%s:%s Parse error: %s", filename, (line or "?"), col0, msg), 0) + return error(string.format("%s:%s:%s: Parse error: %s", filename, (line or "?"), col0, msg), 0) else return friend["parse-error"](msg, filename, (line or "?"), col0, source, options) end @@ -3901,38 +3933,38 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return nil end local function dispatch(v) - local _221_0 = stack[#stack] - if (_221_0 == nil) then + local _224_0 = stack[#stack] + if (_224_0 == nil) then retval, done_3f, whitespace_since_dispatch = v, true, false return nil - elseif ((_G.type(_221_0) == "table") and (nil ~= _221_0.prefix)) then - local prefix = _221_0.prefix + elseif ((_G.type(_224_0) == "table") and (nil ~= _224_0.prefix)) then + local prefix = _224_0.prefix local source0 = nil do - local _222_0 = table.remove(stack) - set_source_fields(_222_0) - source0 = _222_0 + local _225_0 = table.remove(stack) + set_source_fields(_225_0) + source0 = _225_0 end local list = utils.list(utils.sym(prefix, source0), v) for k, v0 in pairs(source0) do list[k] = v0 end return dispatch(list) - elseif (nil ~= _221_0) then - local top = _221_0 + elseif (nil ~= _224_0) then + local top = _224_0 whitespace_since_dispatch = false return table.insert(top, v) end end local function badend() local accum = utils.map(stack, "closer") - local _224_ + local _227_ if (#stack == 1) then - _224_ = "" + _227_ = "" else - _224_ = "s" + _227_ = "s" end - return parse_error(string.format("expected closing delimiter%s %s", _224_, string.char(unpack(accum)))) + return parse_error(string.format("expected closing delimiter%s %s", _227_, string.char(unpack(accum)))) end local function skip_whitespace(b, close_table) if (b and whitespace_3f(b)) then @@ -3950,11 +3982,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end local function parse_comment(b, contents) if (b and (10 ~= b)) then - local function _227_() + local function _230_() table.insert(contents, string.char(b)) return contents end - return parse_comment(getb(), _227_()) + return parse_comment(getb(), _230_()) elseif comments then ungetb(10) return dispatch(utils.comment(table.concat(contents), {filename = filename, line = line})) @@ -3980,12 +4012,12 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return dispatch(setmetatable(tbl, mt)) end local function add_comment_at(comments0, index, node) - local _231_0 = comments0[index] - if (nil ~= _231_0) then - local existing = _231_0 + local _234_0 = comments0[index] + if (nil ~= _234_0) then + local existing = _234_0 return table.insert(existing, node) else - local _ = _231_0 + local _ = _234_0 comments0[index] = {node} return nil end @@ -4064,16 +4096,16 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end local state0 = nil do - local _242_0 = {state, b} - if ((_G.type(_242_0) == "table") and (_242_0[1] == "base") and (_242_0[2] == 92)) then + local _245_0 = {state, b} + if ((_G.type(_245_0) == "table") and (_245_0[1] == "base") and (_245_0[2] == 92)) then state0 = "backslash" - elseif ((_G.type(_242_0) == "table") and (_242_0[1] == "base") and (_242_0[2] == 34)) then + elseif ((_G.type(_245_0) == "table") and (_245_0[1] == "base") and (_245_0[2] == 34)) then state0 = "done" - elseif ((_G.type(_242_0) == "table") and (_242_0[1] == "backslash") and (_242_0[2] == 10)) then + elseif ((_G.type(_245_0) == "table") and (_245_0[1] == "backslash") and (_245_0[2] == 10)) then table.remove(chars, (#chars - 1)) state0 = "base" else - local _ = _242_0 + local _ = _245_0 state0 = "base" end end @@ -4095,11 +4127,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( table.remove(stack) local raw = table.concat(chars) local formatted = raw:gsub("[\7-\13]", escape_char) - local _246_0 = (rawget(_G, "loadstring") or load)(("return " .. formatted)) - if (nil ~= _246_0) then - local load_fn = _246_0 + local _249_0 = (rawget(_G, "loadstring") or load)(("return " .. formatted)) + if (nil ~= _249_0) then + local load_fn = _249_0 return dispatch(load_fn()) - elseif (_246_0 == nil) then + elseif (_249_0 == nil) then return parse_error(("Invalid string: " .. raw)) end end @@ -4132,13 +4164,13 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( dispatch((tonumber(number_with_stripped_underscores) or parse_error(("could not read number \"" .. rawstr .. "\"")))) return true else - local _252_0 = tonumber(number_with_stripped_underscores) - if (nil ~= _252_0) then - local x = _252_0 + local _255_0 = tonumber(number_with_stripped_underscores) + if (nil ~= _255_0) then + local x = _255_0 dispatch(x) return true else - local _ = _252_0 + local _ = _255_0 return false end end @@ -4149,8 +4181,6 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end if (rawstr:match("^~") and (rawstr ~= "~=")) then parse_error("invalid character: ~") - elseif rawstr:match("%.[0-9]") then - parse_error(("can't start multisym segment with a digit: " .. rawstr), col_adjust("%.[0-9]")) elseif (rawstr:match("[%.:][%.:]") and (rawstr ~= "..") and (rawstr ~= "$...")) then parse_error(("malformed multisym: " .. rawstr), col_adjust("[%.:][%.:]")) elseif ((rawstr ~= ":") and rawstr:match(":$")) then @@ -4203,11 +4233,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end return parse_loop(skip_whitespace(getb(), close_table)) end - local function _259_() - stack, line, byteindex, col, lastb = {}, 1, 0, 0, nil + local function _262_() + stack, line, byteindex, col, lastb = {}, 1, 0, 0, ((lastb ~= 10) and lastb) return nil end - return parse_stream, _259_ + return parse_stream, _262_ end local function parser(stream_or_string, _3ffilename, _3foptions) local filename = (_3ffilename or "unknown") @@ -4832,14 +4862,14 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end end pp = _93_ - local function view(x, _3foptions) + local function _view(x, _3foptions) return pp(x, make_options(x, _3foptions), 0) end - return view + return _view end package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(...) local view = require("fennel.view") - local version = "1.4.1-dev" + local version = "1.4.1" local function luajit_vm_3f() return ((nil ~= _G.jit) and (type(_G.jit) == "table") and (nil ~= _G.jit.on) and (nil ~= _G.jit.off) and (type(_G.jit.version_num) == "number")) end @@ -4874,39 +4904,34 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return ("Fennel " .. version .. " on " .. lua_vm_version()) end end - local function warn(message) - if (_G.io and _G.io.stderr) then - return (_G.io.stderr):write(("--WARNING: %s\n"):format(tostring(message))) - end - end local len = nil do - local _104_0, _105_0 = pcall(require, "utf8") - if ((_104_0 == true) and (nil ~= _105_0)) then - local utf8 = _105_0 + local _103_0, _104_0 = pcall(require, "utf8") + if ((_103_0 == true) and (nil ~= _104_0)) then + local utf8 = _104_0 len = utf8.len else - local _ = _104_0 + local _ = _103_0 len = string.len end end local kv_order = {boolean = 2, number = 1, string = 3, table = 4} local function kv_compare(a, b) - local _107_0, _108_0 = type(a), type(b) - if (((_107_0 == "number") and (_108_0 == "number")) or ((_107_0 == "string") and (_108_0 == "string"))) then + local _106_0, _107_0 = type(a), type(b) + if (((_106_0 == "number") and (_107_0 == "number")) or ((_106_0 == "string") and (_107_0 == "string"))) then return (a < b) else - local function _109_() - local a_t = _107_0 - local b_t = _108_0 + local function _108_() + local a_t = _106_0 + local b_t = _107_0 return (a_t ~= b_t) end - if (((nil ~= _107_0) and (nil ~= _108_0)) and _109_()) then - local a_t = _107_0 - local b_t = _108_0 + if (((nil ~= _106_0) and (nil ~= _107_0)) and _108_()) then + local a_t = _106_0 + local b_t = _107_0 return ((kv_order[a_t] or 5) < (kv_order[b_t] or 5)) else - local _ = _107_0 + local _ = _106_0 return (tostring(a) < tostring(b)) end end @@ -4938,20 +4963,20 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function stablepairs(t) local mt_keys = nil do - local _113_0 = getmetatable(t) - if (nil ~= _113_0) then - _113_0 = _113_0.keys + local _112_0 = getmetatable(t) + if (nil ~= _112_0) then + _112_0 = _112_0.keys end - mt_keys = _113_0 + mt_keys = _112_0 end local succ, prev, first_mt = nil, nil, nil - local function _115_(_241) + local function _114_(_241) return t[_241] end - succ, prev, first_mt = add_stable_keys({}, nil, (mt_keys or {}), _115_) + succ, prev, first_mt = add_stable_keys({}, nil, (mt_keys or {}), _114_) local pairs_keys = nil do - local _116_0 = nil + local _115_0 = nil do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -4962,10 +4987,10 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. tbl_17_[i_18_] = val_19_ end end - _116_0 = tbl_17_ + _115_0 = tbl_17_ end - table.sort(_116_0, kv_compare) - pairs_keys = _116_0 + table.sort(_115_0, kv_compare) + pairs_keys = _115_0 end local succ0, _, first_after_mt = add_stable_keys(succ, prev, pairs_keys) local first = nil @@ -4975,19 +5000,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. first = first_mt end local function stablenext(tbl, key) - local _119_0 = nil + local _118_0 = nil if (key == nil) then - _119_0 = first + _118_0 = first else - _119_0 = succ0[key] + _118_0 = succ0[key] end - if (nil ~= _119_0) then - local next_key = _119_0 - local _121_0 = tbl[next_key] - if (_121_0 ~= nil) then - return next_key, _121_0 + if (nil ~= _118_0) then + local next_key = _118_0 + local _120_0 = tbl[next_key] + if (_120_0 ~= nil) then + return next_key, _120_0 else - return _121_0 + return _120_0 end end end @@ -4998,25 +5023,25 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (0 == #path) then return _3ffallback else - local _124_0 = nil + local _123_0 = nil do local t = tbl for _, k in ipairs(path) do if (nil == t) then break end - local _125_0 = type(t) - if (_125_0 == "table") then + local _124_0 = type(t) + if (_124_0 == "table") then t = t[k] else t = nil end end - _124_0 = t + _123_0 = t end - if (nil ~= _124_0) then - local res = _124_0 + if (nil ~= _123_0) then + local res = _123_0 return res else - local _ = _124_0 + local _ = _123_0 return _3ffallback end end @@ -5027,15 +5052,15 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (type(f) == "function") then f0 = f else - local function _129_(_241) + local function _128_(_241) return _241[f] end - f0 = _129_ + f0 = _128_ end for _, x in ipairs(t) do - local _131_0 = f0(x) - if (nil ~= _131_0) then - local v = _131_0 + local _130_0 = f0(x) + if (nil ~= _130_0) then + local v = _130_0 table.insert(out, v) end end @@ -5047,19 +5072,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (type(f) == "function") then f0 = f else - local function _133_(_241) + local function _132_(_241) return _241[f] end - f0 = _133_ + f0 = _132_ end for k, x in stablepairs(t) do - local _135_0, _136_0 = f0(k, x) - if ((nil ~= _135_0) and (nil ~= _136_0)) then - local key = _135_0 - local value = _136_0 - out[key] = value - elseif (nil ~= _135_0) then + local _134_0, _135_0 = f0(k, x) + if ((nil ~= _134_0) and (nil ~= _135_0)) then + local key = _134_0 local value = _135_0 + out[key] = value + elseif (nil ~= _134_0) then + local value = _134_0 table.insert(out, value) end end @@ -5076,13 +5101,13 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return tbl_14_ end local function member_3f(x, tbl, _3fn) - local _139_0 = tbl[(_3fn or 1)] - if (_139_0 == x) then + local _138_0 = tbl[(_3fn or 1)] + if (_138_0 == x) then return true - elseif (_139_0 == nil) then + elseif (_138_0 == nil) then return nil else - local _ = _139_0 + local _ = _138_0 return member_3f(x, tbl, ((_3fn or 1) + 1)) end end @@ -5117,9 +5142,9 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. seen[next_state] = true return next_state, value else - local _142_0 = getmetatable(t) - if ((_G.type(_142_0) == "table") and true) then - local __index = _142_0.__index + local _141_0 = getmetatable(t) + if ((_G.type(_141_0) == "table") and true) then + local __index = _141_0.__index if ("table" == type(__index)) then t = __index return allpairs_next(t) @@ -5137,10 +5162,10 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local safe = {} local view0 = nil if _3fview then - local function _146_(_241) + local function _145_(_241) return _3fview(_241, _3foptions, _3findent) end - view0 = _146_ + view0 = _145_ else view0 = view end @@ -5161,19 +5186,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end local symbol_mt = {"SYMBOL", __eq = sym_3d, __fennelview = deref, __lt = sym_3c, __tostring = deref} local expr_mt = nil - local function _148_(x) + local function _147_(x) return tostring(deref(x)) end - expr_mt = {"EXPR", __tostring = _148_} + expr_mt = {"EXPR", __tostring = _147_} local list_mt = {"LIST", __fennelview = list__3estring, __tostring = list__3estring} local comment_mt = {"COMMENT", __eq = sym_3d, __fennelview = comment_view, __lt = sym_3c, __tostring = deref} local sequence_marker = {"SEQUENCE"} local varg_mt = {"VARARG", __fennelview = deref, __tostring = deref} local getenv = nil - local function _149_() + local function _148_() return nil end - getenv = ((os and os.getenv) or _149_) + getenv = ((os and os.getenv) or _148_) local function debug_on_3f(flag) local level = (getenv("FENNEL_DEBUG") or "") return ((level == "all") or level:find(flag)) @@ -5182,7 +5207,7 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return setmetatable({...}, list_mt) end local function sym(str, _3fsource) - local _150_ + local _149_ do local tbl_14_ = {str} for k, v in pairs((_3fsource or {})) do @@ -5196,13 +5221,13 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. tbl_14_[k_15_] = v_16_ end end - _150_ = tbl_14_ + _149_ = tbl_14_ end - return setmetatable(_150_, symbol_mt) + return setmetatable(_149_, symbol_mt) end nil_sym = sym("nil") local function sequence(...) - local function _153_(seq, view0, inspector, indent) + local function _152_(seq, view0, inspector, indent) local opts = nil do inspector["empty-as-sequence?"] = {after = inspector["empty-as-sequence?"], once = true} @@ -5211,19 +5236,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end return view0(seq, opts, indent) end - return setmetatable({...}, {__fennelview = _153_, sequence = sequence_marker}) + return setmetatable({...}, {__fennelview = _152_, sequence = sequence_marker}) end local function expr(strcode, etype) return setmetatable({strcode, type = etype}, expr_mt) end local function comment_2a(contents, _3fsource) - local _154_ = (_3fsource or {}) - local filename = _154_["filename"] - local line = _154_["line"] + local _153_ = (_3fsource or {}) + local filename = _153_["filename"] + local line = _153_["line"] return setmetatable({contents, filename = filename, line = line}, comment_mt) end local function varg(_3fsource) - local _155_ + local _154_ do local tbl_14_ = {"..."} for k, v in pairs((_3fsource or {})) do @@ -5237,9 +5262,9 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. tbl_14_[k_15_] = v_16_ end end - _155_ = tbl_14_ + _154_ = tbl_14_ end - return setmetatable(_155_, varg_mt) + return setmetatable(_154_, varg_mt) end local function expr_3f(x) return ((type(x) == "table") and (getmetatable(x) == expr_mt) and x) @@ -5277,7 +5302,11 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end end local function string_3f(x) - return (type(x) == "string") + if (type(x) == "string") then + return x + else + return false + end end local function multi_sym_3f(str) if sym_3f(str) then @@ -5310,15 +5339,6 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local t = type(x) return ((t == "string") or (t == "integer") or (t == "number") or (t == "boolean") or (sym_3f(x) and not multi_sym_3f(x))) end - local function ast_source(ast) - if (table_3f(ast) or sequence_3f(ast)) then - return (getmetatable(ast) or {}) - elseif ("table" == type(ast)) then - return ast - else - return {} - end - end local function walk_tree(root, f, _3fcustom_iterator) local function walk(iterfn, parent, idx, node) if f(idx, node, parent) then @@ -5343,27 +5363,53 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return subopts end local root = nil - local function _166_() + local function _165_() end - root = {chunk = nil, options = nil, reset = _166_, scope = nil} - root["set-reset"] = function(_167_0) - local _168_ = _167_0 - local chunk = _168_["chunk"] - local options = _168_["options"] - local reset = _168_["reset"] - local scope = _168_["scope"] + root = {chunk = nil, options = nil, reset = _165_, scope = nil} + root["set-reset"] = function(_166_0) + local _167_ = _166_0 + local chunk = _167_["chunk"] + local options = _167_["options"] + local reset = _167_["reset"] + local scope = _167_["scope"] root.reset = function() root.chunk, root.scope, root.options, root.reset = chunk, scope, options, reset return nil end return root.reset end + local function ast_source(ast) + if (table_3f(ast) or sequence_3f(ast)) then + return (getmetatable(ast) or {}) + elseif ("table" == type(ast)) then + return ast + else + return {} + end + end + local function warn(msg, _3fast) + if (_G.io and _G.io.stderr) then + local loc = nil + do + local _169_0 = ast_source(_3fast) + if ((_G.type(_169_0) == "table") and (nil ~= _169_0.filename) and (nil ~= _169_0.line)) then + local filename = _169_0.filename + local line = _169_0.line + loc = (filename .. ":" .. line .. ": ") + else + local _ = _169_0 + loc = "" + end + end + return (_G.io.stderr):write(("--WARNING: %s%s\n"):format(loc, tostring(msg))) + end + end local warned = {} - local function check_plugin_version(_169_0) - local _170_ = _169_0 - local plugin = _170_ - local name = _170_["name"] - local versions = _170_["versions"] + local function check_plugin_version(_172_0) + local _173_ = _172_0 + local plugin = _173_ + local name = _173_["name"] + local versions = _173_["versions"] if (not member_3f(version:gsub("-dev", ""), (versions or {})) and not warned[plugin]) then warned[plugin] = true return warn(string.format("plugin %s does not support Fennel version %s", (name or "unknown"), version)) @@ -5371,29 +5417,29 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end local function hook_opts(event, _3foptions, ...) local plugins = nil - local function _173_(...) - local _172_0 = _3foptions - if (nil ~= _172_0) then - _172_0 = _172_0.plugins - end - return _172_0 - end local function _176_(...) - local _175_0 = root.options + local _175_0 = _3foptions if (nil ~= _175_0) then _175_0 = _175_0.plugins end return _175_0 end - plugins = (_173_(...) or _176_(...)) + local function _179_(...) + local _178_0 = root.options + if (nil ~= _178_0) then + _178_0 = _178_0.plugins + end + return _178_0 + end + plugins = (_176_(...) or _179_(...)) if plugins then local result = nil for _, plugin in ipairs(plugins) do if result then break end check_plugin_version(plugin) - local _178_0 = plugin[event] - if (nil ~= _178_0) then - local f = _178_0 + local _181_0 = plugin[event] + if (nil ~= _181_0) then + local f = _181_0 result = f(...) else result = nil @@ -5405,7 +5451,7 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function hook(event, ...) return hook_opts(event, root.options, ...) end - return {["ast-source"] = ast_source, ["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["every?"] = every_3f, ["expr?"] = expr_3f, ["get-in"] = get_in, ["hook-opts"] = hook_opts, ["idempotent-expr?"] = idempotent_expr_3f, ["kv-table?"] = kv_table_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";"), ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["runtime-version"] = runtime_version, ["sequence?"] = sequence_3f, ["string?"] = string_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, expr = expr, hook = hook, kvmap = kvmap, len = len, list = list, map = map, maxn = maxn, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg, version = version, warn = warn} + return {["ast-source"] = ast_source, ["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["every?"] = every_3f, ["expr?"] = expr_3f, ["fennel-module"] = nil, ["get-in"] = get_in, ["hook-opts"] = hook_opts, ["idempotent-expr?"] = idempotent_expr_3f, ["kv-table?"] = kv_table_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";"), ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["runtime-version"] = runtime_version, ["sequence?"] = sequence_3f, ["string?"] = string_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, expr = expr, hook = hook, kvmap = kvmap, len = len, list = list, map = map, maxn = maxn, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg, version = version, warn = warn} end package.preload["fennel"] = package.preload["fennel"] or function(...) local utils = require("fennel.utils") @@ -5443,14 +5489,14 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) local env = eval_env(opts.env, opts) local lua_source = compiler["compile-string"](str, opts) local loader = nil - local function _745_(...) + local function _752_(...) if opts.filename then return ("@" .. opts.filename) else return str end end - loader = specials["load-code"](lua_source, env, _745_(...)) + loader = specials["load-code"](lua_source, env, _752_(...)) opts.filename = nil return loader(...) end @@ -5466,25 +5512,28 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) local body_3f = {"when", "with-open", "collect", "icollect", "fcollect", "lambda", "\206\187", "macro", "match", "match-try", "case", "case-try", "accumulate", "faccumulate", "doto"} local binding_3f = {"collect", "icollect", "fcollect", "each", "for", "let", "with-open", "accumulate", "faccumulate"} local define_3f = {"fn", "lambda", "\206\187", "var", "local", "macro", "macros", "global"} + local deprecated = {"~=", "#", "global", "require-macros", "pick-args"} local out = {} for k, v in pairs(compiler.scopes.global.specials) do local metadata = (compiler.metadata[v] or {}) - out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = metadata["fnl/body-form?"], ["define?"] = utils["member?"](k, define_3f), ["special?"] = true} + out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = metadata["fnl/body-form?"], ["define?"] = utils["member?"](k, define_3f), ["deprecated?"] = utils["member?"](k, deprecated), ["special?"] = true} end - for k, v in pairs(compiler.scopes.global.macros) do + for k in pairs(compiler.scopes.global.macros) do out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = utils["member?"](k, body_3f), ["define?"] = utils["member?"](k, define_3f), ["macro?"] = true} end for k, v in pairs(_G) do - local _746_0 = type(v) - if (_746_0 == "function") then + local _753_0 = type(v) + if (_753_0 == "function") then out[k] = {["function?"] = true, ["global?"] = true} - elseif (_746_0 == "table") then - for k2, v2 in pairs(v) do - if (("function" == type(v2)) and (k ~= "_G")) then - out[(k .. "." .. k2)] = {["function?"] = true, ["global?"] = true} + elseif (_753_0 == "table") then + if not k:find("^_") then + for k2, v2 in pairs(v) do + if ("function" == type(v2)) then + out[(k .. "." .. k2)] = {["function?"] = true, ["global?"] = true} + end end + out[k] = {["global?"] = true} end - out[k] = {["global?"] = true} end end return out @@ -5498,17 +5547,18 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) do local module_name = "fennel.macros" local _ = nil - local function _749_() + local function _757_() return mod end - package.preload[module_name] = _749_ + package.preload[module_name] = _757_ _ = nil local env = nil do - local _750_0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) - _750_0["utils"] = utils - _750_0["fennel"] = mod - env = _750_0 + local _758_0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) + _758_0["utils"] = utils + _758_0["fennel"] = mod + _758_0["get-function-metadata"] = specials["get-function-metadata"] + env = _758_0 end local built_ins = eval([===[;; fennel-ls: macro-file @@ -5613,7 +5663,8 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) ,...) closer `(fn close-handlers# [ok# ...] (if ok# ... (error ... 0))) - traceback `(. (or package.loaded.fennel debug) :traceback)] + traceback `(. (or (. package.loaded ,(fennel-module-name)) debug) + :traceback)] (for [i 1 (length closable-bindings) 2] (assert (sym? (. closable-bindings i)) "with-open only allows symbols in bindings") @@ -5676,7 +5727,8 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) (let [(into iter has-into?) (extract-into iter-tbl)] (if has-into? `(let [tbl# ,into] - (,how ,iter (table.insert tbl# ,value-expr)) + (,how ,iter (let [val# ,value-expr] + (table.insert tbl# val#))) tbl#) ;; believe it or not, using a var here has a pretty good performance ;; boost: https://p.hagelb.org/icollect-performance.html @@ -5837,19 +5889,16 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) has-internal-name? (sym? (. args 1)) arglist (if has-internal-name? (. args 2) (. args 1)) metadata-position (if has-internal-name? 3 2) - has-metadata? (and (< metadata-position args-len) - (or (= :string (type (. args metadata-position))) - (utils.kv-table? (. args metadata-position)))) - arity-check-position (- 4 (if has-internal-name? 0 1) - (if has-metadata? 0 1)) - empty-body? (< args-len arity-check-position)] + (f-metadata check-position) (get-function-metadata [:lambda ...] arglist + metadata-position) + empty-body? (< args-len check-position)] (fn check! [a] (if (table? a) (each [_ a (pairs a)] (check! a)) (let [as (tostring a)] (and (not (as:match "^?")) (not= as "&") (not= as "_") (not= as "...") (not= as "&as"))) - (table.insert args arity-check-position + (table.insert args check-position `(_G.assert (not= nil ,a) ,(: "Missing argument %s on %s:%s" :format (tostring a) @@ -5858,8 +5907,7 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) (assert (= :table (type arglist)) "expected arg list") (each [_ a (ipairs arglist)] (check! a)) - (if empty-body? - (table.insert args (sym :nil))) + (if empty-body? (table.insert args (sym :nil))) `(fn ,(unpack args)))) (fn macro* [name ...] @@ -5907,29 +5955,31 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) (tset scope.macros import-key (. macros* macro-name)))))) nil) - (fn assert-repl* [condition message ?opts] - "Drop into a debug repl and print the message when condition is false/nil. - Takes an optional table of arguments which will be passed to fennel.repl." + (fn assert-repl* [condition ...] + "Enter into a debug REPL and print the message when condition is false/nil. + Works as a drop-in replacement for Lua's `assert`. + REPL `,return` command returns values to assert in place to continue execution." + {:fnl/arglist [condition ?message ...]} (fn add-locals [{: symmeta : parent} locals] (each [name (pairs symmeta)] (tset locals name (sym name))) (if parent (add-locals parent locals) locals)) - `(let [condition# ,condition - message# (or ,message "assertion failed, entering repl.")] + `(let [unpack# (or table.unpack _G.unpack) + pack# (or table.pack #(doto [$...] (tset :n (select :# $...)))) + ;; need to pack/unpack input args to account for (assert (foo)), + ;; because assert returns *all* arguments upon success + vals# (pack# ,condition ,...) + condition# (. vals# 1) + message# (or (. vals# 2) "assertion failed, entering repl.")] (if (not condition#) - (let [opts# (or ,?opts {:assert-repl? true - :readChunk (?. _G :___repl___ :readChunk) - :onError (?. _G :___repl___ :onError) - :onValued (?. _G :___repl___ :onValued)}) - fennel# (require (or opts#.moduleName :fennel)) + (let [opts# {:assert-repl? true} + fennel# (require ,(fennel-module-name)) locals# ,(add-locals (get-scope) [])] (set opts#.message (fennel#.traceback message#)) (set opts#.env (collect [k# v# (pairs _G) &into locals#] (if (= nil (. locals# k#)) (values k# v#)))) - (_G.assert (fennel#.repl opts#) message#)) - ;; `assert` returns *all* params on success, but omitting opts# to - ;; defensively prevent accidental leakage of REPL opts into code - (values condition# message#)))) + (_G.assert (fennel#.repl opts#))) + (values (unpack# vals# 1 vals#.n))))) {:-> ->* :->> ->>* @@ -6076,13 +6126,12 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) (fn case-or [vals pattern guards unifications case-pattern opts] (let [pattern [(unpack pattern 2)] - bindings (symbols-in-every-pattern pattern opts.infer-unification?)] ;; TODO opts.infer-unification instead of opts.unification? + bindings (symbols-in-every-pattern pattern opts.infer-unification?)] (if (= 0 (length bindings)) ;; no bindings special case generates simple code (let [condition (icollect [_ subpattern (ipairs pattern) &into `(or)] - (let [(subcondition subbindings) (case-pattern vals subpattern unifications opts)] - subcondition))] + (case-pattern vals subpattern unifications opts))] (values (if (= 0 (length guards)) condition @@ -6355,20 +6404,20 @@ package.preload["fennel"] = package.preload["fennel"] or function(...) end fennel = require("fennel") local unpack = (table.unpack or _G.unpack) -local help = "\nUsage: fennel [FLAG] [FILE]\n\nRun fennel, a lisp programming language for the Lua runtime.\n\n --repl : Command to launch an interactive repl session\n --compile FILES (-c) : Command to AOT compile files, writing Lua to stdout\n --eval SOURCE (-e) : Command to evaluate source code and print result\n\n --correlate : Make Lua output line numbers match Fennel input\n --load FILE (-l) : Load the specified FILE before executing command\n --no-compiler-sandbox : Don't limit compiler environment to minimal sandbox\n --compile-binary FILE\n OUT LUA_LIB LUA_DIR : Compile FILE to standalone binary OUT\n --compile-binary --help : Display further help for compiling binaries\n --add-package-path PATH : Add PATH to package.path for finding Lua modules\n --add-package-cpath PATH : Add PATH to package.cpath for finding Lua modules\n --add-fennel-path PATH : Add PATH to fennel.path for finding Fennel modules\n --add-macro-path PATH : Add PATH to fennel.macro-path for macro modules\n --globals G1[,G2...] : Allow these globals in addition to standard ones\n --globals-only G1[,G2] : Same as above, but exclude standard ones\n --assert-as-repl : Replace assert calls with assert-repl\n --require-as-include : Inline required modules in the output\n --skip-include M1[,M2] : Omit certain modules from output when included\n --use-bit-lib : Use LuaJITs bit library instead of operators\n --metadata : Enable function metadata, even in compiled output\n --no-metadata : Disable function metadata, even in REPL\n --lua LUA_EXE : Run in a child process with LUA_EXE\n --plugin FILE : Activate the compiler plugin in FILE\n --raw-errors : Disable friendly compile error reporting\n --no-searcher : Skip installing package.searchers entry\n --no-fennelrc : Skip loading ~/.fennelrc when launching repl\n\n --help (-h) : Display this text\n --version (-v) : Show version\n\nGlobals are not checked when doing AOT (ahead-of-time) compilation unless\nthe --globals-only or --globals flag is provided. Use --globals \"*\" to disable\nstrict globals checking in other contexts.\n\nMetadata is typically considered a development feature and is not recommended\nfor production. It is used for docstrings and enabled by default in the REPL.\n\nWhen not given a command, runs the file given as the first argument.\nWhen given neither command nor file, launches a repl.\n\nUse the NO_COLOR environment variable to disable escape codes in error messages.\n\nIf ~/.fennelrc exists, it will be loaded before launching a repl." +local help = "Usage: fennel [FLAG] [FILE]\n\nRun fennel, a lisp programming language for the Lua runtime.\n\n --repl : Command to launch an interactive repl session\n --compile FILES (-c) : Command to AOT compile files, writing Lua to stdout\n --eval SOURCE (-e) : Command to evaluate source code and print result\n\n --correlate : Make Lua output line numbers match Fennel input\n --load FILE (-l) : Load the specified FILE before executing command\n --no-compiler-sandbox : Don't limit compiler environment to minimal sandbox\n --compile-binary FILE\n OUT LUA_LIB LUA_DIR : Compile FILE to standalone binary OUT\n --compile-binary --help : Display further help for compiling binaries\n --add-package-path PATH : Add PATH to package.path for finding Lua modules\n --add-package-cpath PATH : Add PATH to package.cpath for finding Lua modules\n --add-fennel-path PATH : Add PATH to fennel.path for finding Fennel modules\n --add-macro-path PATH : Add PATH to fennel.macro-path for macro modules\n --globals G1[,G2...] : Allow these globals in addition to standard ones\n --globals-only G1[,G2] : Same as above, but exclude standard ones\n --assert-as-repl : Replace assert calls with assert-repl\n --require-as-include : Inline required modules in the output\n --skip-include M1[,M2] : Omit certain modules from output when included\n --use-bit-lib : Use LuaJITs bit library instead of operators\n --metadata : Enable function metadata, even in compiled output\n --no-metadata : Disable function metadata, even in REPL\n --lua LUA_EXE : Run in a child process with LUA_EXE\n --plugin FILE : Activate the compiler plugin in FILE\n --raw-errors : Disable friendly compile error reporting\n --no-searcher : Skip installing package.searchers entry\n --no-fennelrc : Skip loading ~/.fennelrc when launching repl\n\n --help (-h) : Display this text\n --version (-v) : Show version\n\nGlobals are not checked when doing AOT (ahead-of-time) compilation unless\nthe --globals-only or --globals flag is provided. Use --globals \"*\" to disable\nstrict globals checking in other contexts.\n\nMetadata is typically considered a development feature and is not recommended\nfor production. It is used for docstrings and enabled by default in the REPL.\n\nWhen not given a command, runs the file given as the first argument.\nWhen given neither command nor file, launches a repl.\n\nUse the NO_COLOR environment variable to disable escape codes in error messages.\n\nIf ~/.fennelrc exists, it will be loaded before launching a repl." local options = {plugins = {}} local function pack(...) - local _751_0 = {...} - _751_0["n"] = select("#", ...) - return _751_0 + local _759_0 = {...} + _759_0["n"] = select("#", ...) + return _759_0 end local function dosafely(f, ...) local args = {...} local result = nil - local function _752_() + local function _760_() return f(unpack(args)) end - result = pack(xpcall(_752_, fennel.traceback)) + result = pack(xpcall(_760_, fennel.traceback)) if not result[1] then do end (io.stderr):write((result[2] .. "\n")) os.exit(1) @@ -6413,18 +6462,18 @@ local function handle_lua(i) if (nil == arg[-1]) then do end (io.stderr):write("WARNING: --lua argument only works from script, not binary.\n") end - local _757_0, _758_0 = os.execute(table.concat(cmd, " ")) - if (((_757_0 == true) and (_758_0 == "exit")) or (_757_0 == 0)) then + local _765_0, _766_0 = os.execute(table.concat(cmd, " ")) + if (((_765_0 == true) and (_766_0 == "exit")) or (_765_0 == 0)) then return os.exit(0, true) else - local _ = _757_0 + local _ = _765_0 return os.exit(1, true) end end assert(arg, "Using the launcher from non-CLI context; use fennel.lua instead.") for i = #arg, 1, -1 do - local _760_0 = arg[i] - if (_760_0 == "--lua") then + local _768_0 = arg[i] + if (_768_0 == "--lua") then handle_lua(i) end end @@ -6432,58 +6481,58 @@ do local commands = {["-"] = true, ["--compile"] = true, ["--compile-binary"] = true, ["--eval"] = true, ["--help"] = true, ["--repl"] = true, ["--version"] = true, ["-c"] = true, ["-e"] = true, ["-h"] = true, ["-v"] = true} local i = 1 while (arg[i] and not options["ignore-options"]) do - local _762_0 = arg[i] - if (_762_0 == "--no-searcher") then + local _770_0 = arg[i] + if (_770_0 == "--no-searcher") then options["no-searcher"] = true table.remove(arg, i) - elseif (_762_0 == "--indent") then + elseif (_770_0 == "--indent") then options.indent = table.remove(arg, (i + 1)) if (options.indent == "false") then options.indent = false end table.remove(arg, i) - elseif (_762_0 == "--add-package-path") then + elseif (_770_0 == "--add-package-path") then local entry = table.remove(arg, (i + 1)) package.path = (entry .. ";" .. package.path) table.remove(arg, i) - elseif (_762_0 == "--add-package-cpath") then + elseif (_770_0 == "--add-package-cpath") then local entry = table.remove(arg, (i + 1)) package.cpath = (entry .. ";" .. package.cpath) table.remove(arg, i) - elseif (_762_0 == "--add-fennel-path") then + elseif (_770_0 == "--add-fennel-path") then local entry = table.remove(arg, (i + 1)) fennel.path = (entry .. ";" .. fennel.path) table.remove(arg, i) - elseif (_762_0 == "--add-macro-path") then + elseif (_770_0 == "--add-macro-path") then local entry = table.remove(arg, (i + 1)) fennel["macro-path"] = (entry .. ";" .. fennel["macro-path"]) table.remove(arg, i) - elseif (_762_0 == "--load") then + elseif (_770_0 == "--load") then handle_load(i) - elseif (_762_0 == "-l") then + elseif (_770_0 == "-l") then handle_load(i) - elseif (_762_0 == "--no-fennelrc") then + elseif (_770_0 == "--no-fennelrc") then options.fennelrc = false table.remove(arg, i) - elseif (_762_0 == "--correlate") then + elseif (_770_0 == "--correlate") then options.correlate = true table.remove(arg, i) - elseif (_762_0 == "--check-unused-locals") then + elseif (_770_0 == "--check-unused-locals") then options.checkUnusedLocals = true table.remove(arg, i) - elseif (_762_0 == "--globals") then + elseif (_770_0 == "--globals") then allow_globals(table.remove(arg, (i + 1)), _G) table.remove(arg, i) - elseif (_762_0 == "--globals-only") then + elseif (_770_0 == "--globals-only") then allow_globals(table.remove(arg, (i + 1)), {}) table.remove(arg, i) - elseif (_762_0 == "--require-as-include") then + elseif (_770_0 == "--require-as-include") then options.requireAsInclude = true table.remove(arg, i) - elseif (_762_0 == "--assert-as-repl") then + elseif (_770_0 == "--assert-as-repl") then options.assertAsRepl = true table.remove(arg, i) - elseif (_762_0 == "--skip-include") then + elseif (_770_0 == "--skip-include") then local skip_names = table.remove(arg, (i + 1)) local skip = nil do @@ -6500,28 +6549,28 @@ do end options.skipInclude = skip table.remove(arg, i) - elseif (_762_0 == "--use-bit-lib") then + elseif (_770_0 == "--use-bit-lib") then options.useBitLib = true table.remove(arg, i) - elseif (_762_0 == "--metadata") then + elseif (_770_0 == "--metadata") then options.useMetadata = true table.remove(arg, i) - elseif (_762_0 == "--no-metadata") then + elseif (_770_0 == "--no-metadata") then options.useMetadata = false table.remove(arg, i) - elseif (_762_0 == "--no-compiler-sandbox") then + elseif (_770_0 == "--no-compiler-sandbox") then options["compiler-env"] = _G table.remove(arg, i) - elseif (_762_0 == "--raw-errors") then + elseif (_770_0 == "--raw-errors") then options.unfriendly = true table.remove(arg, i) - elseif (_762_0 == "--plugin") then + elseif (_770_0 == "--plugin") then local opts = {["compiler-env"] = _G, env = "_COMPILER", useMetadata = true} local plugin = fennel.dofile(table.remove(arg, (i + 1)), opts) table.insert(options.plugins, 1, plugin) table.remove(arg, i) else - local _ = _762_0 + local _ = _770_0 if not commands[arg[i]] then options["ignore-options"] = true i = (i + 1) @@ -6569,13 +6618,13 @@ local function repl() return fennel.repl(options) end local function eval(form) - local _772_ + local _780_ if (form == "-") then - _772_ = (io.stdin):read("*a") + _780_ = (io.stdin):read("*a") else - _772_ = form + _780_ = form end - return print(dosafely(fennel.eval, _772_, options)) + return print(dosafely(fennel.eval, _780_, options)) end local function compile(files) for _, filename in ipairs(files) do @@ -6587,17 +6636,17 @@ local function compile(files) f = assert(io.open(filename, "rb")) end do - local _775_0, _776_0 = nil, nil - local function _777_() + local _783_0, _784_0 = nil, nil + local function _785_() return fennel["compile-string"](f:read("*a"), options) end - _775_0, _776_0 = xpcall(_777_, fennel.traceback) - if ((_775_0 == true) and (nil ~= _776_0)) then - local val = _776_0 + _783_0, _784_0 = xpcall(_785_, fennel.traceback) + if ((_783_0 == true) and (nil ~= _784_0)) then + local val = _784_0 print(val) - elseif (true and (nil ~= _776_0)) then - local _0 = _775_0 - local msg = _776_0 + elseif (true and (nil ~= _784_0)) then + local _0 = _783_0 + local msg = _784_0 do end (io.stderr):write((msg .. "\n")) os.exit(1) end @@ -6606,56 +6655,56 @@ local function compile(files) end return nil end -local _779_0 = arg -local function _780_(...) +local _787_0 = arg +local function _788_(...) return (0 == #arg) end -if ((_G.type(_779_0) == "table") and _780_(...)) then +if ((_G.type(_787_0) == "table") and _788_(...)) then return repl() -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "--repl")) then +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "--repl")) then return repl() -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "--compile")) then - local files = {select(2, (table.unpack or _G.unpack)(_779_0))} +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "--compile")) then + local files = {select(2, (table.unpack or _G.unpack)(_787_0))} return compile(files) -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "-c")) then - local files = {select(2, (table.unpack or _G.unpack)(_779_0))} +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "-c")) then + local files = {select(2, (table.unpack or _G.unpack)(_787_0))} return compile(files) -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "--compile-binary") and (nil ~= _779_0[2]) and (nil ~= _779_0[3]) and (nil ~= _779_0[4]) and (nil ~= _779_0[5])) then - local filename = _779_0[2] - local out = _779_0[3] - local static_lua = _779_0[4] - local lua_include_dir = _779_0[5] - local args = {select(6, (table.unpack or _G.unpack)(_779_0))} +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "--compile-binary") and (nil ~= _787_0[2]) and (nil ~= _787_0[3]) and (nil ~= _787_0[4]) and (nil ~= _787_0[5])) then + local filename = _787_0[2] + local out = _787_0[3] + local static_lua = _787_0[4] + local lua_include_dir = _787_0[5] + local args = {select(6, (table.unpack or _G.unpack)(_787_0))} local bin = require("fennel.binary") options.filename = filename options.requireAsInclude = true return bin.compile(filename, out, static_lua, lua_include_dir, options, args) -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "--compile-binary")) then +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "--compile-binary")) then local cmd = (arg[0] or "fennel") return print((require("fennel.binary").help):format(cmd, cmd, cmd)) -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "--eval") and (nil ~= _779_0[2])) then - local form = _779_0[2] +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "--eval") and (nil ~= _787_0[2])) then + local form = _787_0[2] return eval(form) -elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "-e") and (nil ~= _779_0[2])) then - local form = _779_0[2] +elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "-e") and (nil ~= _787_0[2])) then + local form = _787_0[2] return eval(form) else - local function _810_(...) - local a = _779_0[1] + local function _818_(...) + local a = _787_0[1] return ((a == "-v") or (a == "--version")) end - if (((_G.type(_779_0) == "table") and (nil ~= _779_0[1])) and _810_(...)) then - local a = _779_0[1] + if (((_G.type(_787_0) == "table") and (nil ~= _787_0[1])) and _818_(...)) then + local a = _787_0[1] return print(fennel["runtime-version"]()) - elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "--help")) then + elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "--help")) then return print(help) - elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "-h")) then + elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "-h")) then return print(help) - elseif ((_G.type(_779_0) == "table") and (_779_0[1] == "-")) then + elseif ((_G.type(_787_0) == "table") and (_787_0[1] == "-")) then return dosafely(fennel.eval, (io.stdin):read("*a")) - elseif ((_G.type(_779_0) == "table") and (nil ~= _779_0[1])) then - local filename = _779_0[1] - local args = {select(2, (table.unpack or _G.unpack)(_779_0))} + elseif ((_G.type(_787_0) == "table") and (nil ~= _787_0[1])) then + local filename = _787_0[1] + local args = {select(2, (table.unpack or _G.unpack)(_787_0))} arg[-2] = arg[-1] arg[-1] = arg[0] arg[0] = table.remove(arg, 1) diff --git a/src/fennel.lua b/src/fennel.lua index 824f160..9fed28d 100644 --- a/src/fennel.lua +++ b/src/fennel.lua @@ -6,7 +6,6 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local compiler = require("fennel.compiler") local specials = require("fennel.specials") local view = require("fennel.view") - local unpack = (table.unpack or _G.unpack) local depth = 0 local function prompt_for(top_3f) if top_3f then @@ -26,18 +25,18 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return io.write("\n") end local function default_on_error(errtype, err, lua_source) - local function _612_() - local _611_0 = errtype - if (_611_0 == "Lua Compile") then + local function _618_() + local _617_0 = errtype + if (_617_0 == "Lua Compile") then return ("Bad code generated - likely a bug with the compiler:\n" .. "--- Generated Lua Start ---\n" .. lua_source .. "--- Generated Lua End ---\n") - elseif (_611_0 == "Runtime") then + elseif (_617_0 == "Runtime") then return (compiler.traceback(tostring(err), 4) .. "\n") else - local _ = _611_0 + local _ = _617_0 return ("%s error: %s\n"):format(errtype, tostring(err)) end end - return io.write(_612_()) + return io.write(_618_()) end local function splice_save_locals(env, lua_source, scope) local saves = nil @@ -77,25 +76,25 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) else gap = " " end - local function _618_() + local function _624_() if next(saves) then return (table.concat(saves, " ") .. gap) else return "" end end - local function _621_() - local _619_0, _620_0 = lua_source:match("^(.*)[\n ](return .*)$") - if ((nil ~= _619_0) and (nil ~= _620_0)) then - local body = _619_0 - local _return = _620_0 + local function _627_() + local _625_0, _626_0 = lua_source:match("^(.*)[\n ](return .*)$") + if ((nil ~= _625_0) and (nil ~= _626_0)) then + local body = _625_0 + local _return = _626_0 return (body .. gap .. table.concat(binds, " ") .. gap .. _return) else - local _ = _619_0 + local _ = _625_0 return lua_source end end - return (_618_() .. _621_()) + return (_624_() .. _627_()) end local function completer(env, scope, text) local max_items = 2000 @@ -107,14 +106,14 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local scope_first_3f = ((tbl == env) or (tbl == env.___replLocals___)) local tbl_17_ = matches local i_18_ = #tbl_17_ - local function _623_() + local function _629_() if scope_first_3f then return scope.manglings else return tbl end end - for k, is_mangled in utils.allpairs(_623_()) do + for k, is_mangled in utils.allpairs(_629_()) do if (max_items <= #matches) then break end local val_19_ = nil do @@ -182,7 +181,7 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return input:match("^%s*,") end local function command_docs() - local _632_ + local _638_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -193,18 +192,18 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) tbl_17_[i_18_] = val_19_ end end - _632_ = tbl_17_ + _638_ = tbl_17_ end - return table.concat(_632_, "\n") + return table.concat(_638_, "\n") end commands.help = function(_, _0, on_values) return on_values({("Welcome to Fennel.\nThis is the REPL where you can enter code to be evaluated.\nYou can also run these repl commands:\n\n" .. command_docs() .. "\n ,return FORM - Evaluate FORM and return its value to the REPL's caller.\n ,exit - Leave the repl.\n\nUse ,doc something to see descriptions for individual macros and special forms.\nValues from previous inputs are kept in *1, *2, and *3.\n\nFor more information about the language, see https://fennel-lang.org/reference")}) end do end (compiler.metadata):set(commands.help, "fnl/docstring", "Show this message.") local function reload(module_name, env, on_values, on_error) - local _634_0, _635_0 = pcall(specials["load-code"]("return require(...)", env), module_name) - if ((_634_0 == true) and (nil ~= _635_0)) then - local old = _635_0 + local _640_0, _641_0 = pcall(specials["load-code"]("return require(...)", env), module_name) + if ((_640_0 == true) and (nil ~= _641_0)) then + local old = _641_0 local _ = nil package.loaded[module_name] = nil _ = nil @@ -229,8 +228,8 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) package.loaded[module_name] = old end return on_values({"ok"}) - elseif ((_634_0 == false) and (nil ~= _635_0)) then - local msg = _635_0 + elseif ((_640_0 == false) and (nil ~= _641_0)) then + local msg = _641_0 if msg:match("loop or previous error loading module") then package.loaded[module_name] = nil return reload(module_name, env, on_values, on_error) @@ -238,32 +237,32 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) specials["macro-loaded"][module_name] = nil return nil else - local function _640_() - local _639_0 = msg:gsub("\n.*", "") - return _639_0 + local function _646_() + local _645_0 = msg:gsub("\n.*", "") + return _645_0 end - return on_error("Runtime", _640_()) + return on_error("Runtime", _646_()) end end end local function run_command(read, on_error, f) - local _643_0, _644_0, _645_0 = pcall(read) - if ((_643_0 == true) and (_644_0 == true) and (nil ~= _645_0)) then - local val = _645_0 - local _646_0, _647_0 = pcall(f, val) - if ((_646_0 == false) and (nil ~= _647_0)) then - local msg = _647_0 + local _649_0, _650_0, _651_0 = pcall(read) + if ((_649_0 == true) and (_650_0 == true) and (nil ~= _651_0)) then + local val = _651_0 + local _652_0, _653_0 = pcall(f, val) + if ((_652_0 == false) and (nil ~= _653_0)) then + local msg = _653_0 return on_error("Runtime", msg) end - elseif (_643_0 == false) then + elseif (_649_0 == false) then return on_error("Parse", "Couldn't parse input.") end end commands.reload = function(env, read, on_values, on_error) - local function _650_(_241) + local function _656_(_241) return reload(tostring(_241), env, on_values, on_error) end - return run_command(read, on_error, _650_) + return run_command(read, on_error, _656_) end do end (compiler.metadata):set(commands.reload, "fnl/docstring", "Reload the specified module.") commands.reset = function(env, _, on_values) @@ -272,28 +271,28 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end do end (compiler.metadata):set(commands.reset, "fnl/docstring", "Erase all repl-local scope.") commands.complete = function(env, read, on_values, on_error, scope, chars) - local function _651_() + local function _657_() return on_values(completer(env, scope, table.concat(chars):gsub(",complete +", ""):sub(1, -2))) end - return run_command(read, on_error, _651_) + return run_command(read, on_error, _657_) end do end (compiler.metadata):set(commands.complete, "fnl/docstring", "Print all possible completions for a given input symbol.") local function apropos_2a(pattern, tbl, prefix, seen, names) for name, subtbl in pairs(tbl) do if (("string" == type(name)) and (package ~= subtbl)) then - local _652_0 = type(subtbl) - if (_652_0 == "function") then + local _658_0 = type(subtbl) + if (_658_0 == "function") then if ((prefix .. name)):match(pattern) then table.insert(names, (prefix .. name)) end - elseif (_652_0 == "table") then + elseif (_658_0 == "table") then if not seen[subtbl] then - local _654_ + local _660_ do seen[subtbl] = true - _654_ = seen + _660_ = seen end - apropos_2a(pattern, subtbl, (prefix .. name:gsub("%.", "/") .. "."), _654_, names) + apropos_2a(pattern, subtbl, (prefix .. name:gsub("%.", "/") .. "."), _660_, names) end end end @@ -314,10 +313,10 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return tbl_17_ end commands.apropos = function(_env, read, on_values, on_error, _scope) - local function _659_(_241) + local function _665_(_241) return on_values(apropos(tostring(_241))) end - return run_command(read, on_error, _659_) + return run_command(read, on_error, _665_) end do end (compiler.metadata):set(commands.apropos, "fnl/docstring", "Print all functions matching a pattern in all loaded modules.") local function apropos_follow_path(path) @@ -337,12 +336,12 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local tgt = package.loaded for _, path0 in ipairs(paths) do if (nil == tgt) then break end - local _662_ + local _668_ do - local _661_0 = path0:gsub("%/", ".") - _662_ = _661_0 + local _667_0 = path0:gsub("%/", ".") + _668_ = _667_0 end - tgt = tgt[_662_] + tgt = tgt[_668_] end return tgt end @@ -354,9 +353,9 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) do local tgt = apropos_follow_path(path) if ("function" == type(tgt)) then - local _663_0 = (compiler.metadata):get(tgt, "fnl/docstring") - if (nil ~= _663_0) then - local docstr = _663_0 + local _669_0 = (compiler.metadata):get(tgt, "fnl/docstring") + if (nil ~= _669_0) then + local docstr = _669_0 val_19_ = (docstr:match(pattern) and path) else val_19_ = nil @@ -373,10 +372,10 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return tbl_17_ end commands["apropos-doc"] = function(_env, read, on_values, on_error, _scope) - local function _667_(_241) + local function _673_(_241) return on_values(apropos_doc(tostring(_241))) end - return run_command(read, on_error, _667_) + return run_command(read, on_error, _673_) end do end (compiler.metadata):set(commands["apropos-doc"], "fnl/docstring", "Print all functions that match the pattern in their docs") local function apropos_show_docs(on_values, pattern) @@ -390,108 +389,108 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return nil end commands["apropos-show-docs"] = function(_env, read, on_values, on_error) - local function _669_(_241) + local function _675_(_241) return apropos_show_docs(on_values, tostring(_241)) end - return run_command(read, on_error, _669_) + return run_command(read, on_error, _675_) end do end (compiler.metadata):set(commands["apropos-show-docs"], "fnl/docstring", "Print all documentations matching a pattern in function name") - local function resolve(identifier, _670_0, scope) - local _671_ = _670_0 - local env = _671_ - local ___replLocals___ = _671_["___replLocals___"] + local function resolve(identifier, _676_0, scope) + local _677_ = _676_0 + local env = _677_ + local ___replLocals___ = _677_["___replLocals___"] local e = nil - local function _672_(_241, _242) + local function _678_(_241, _242) return (___replLocals___[scope.unmanglings[_242]] or env[_242]) end - e = setmetatable({}, {__index = _672_}) - local function _673_(...) - local _674_0, _675_0 = ... - if ((_674_0 == true) and (nil ~= _675_0)) then - local code = _675_0 - local function _676_(...) - local _677_0, _678_0 = ... - if ((_677_0 == true) and (nil ~= _678_0)) then - local val = _678_0 + e = setmetatable({}, {__index = _678_}) + local function _679_(...) + local _680_0, _681_0 = ... + if ((_680_0 == true) and (nil ~= _681_0)) then + local code = _681_0 + local function _682_(...) + local _683_0, _684_0 = ... + if ((_683_0 == true) and (nil ~= _684_0)) then + local val = _684_0 return val else - local _ = _677_0 + local _ = _683_0 return nil end end - return _676_(pcall(specials["load-code"](code, e))) + return _682_(pcall(specials["load-code"](code, e))) else - local _ = _674_0 + local _ = _680_0 return nil end end - return _673_(pcall(compiler["compile-string"], tostring(identifier), {scope = scope})) + return _679_(pcall(compiler["compile-string"], tostring(identifier), {scope = scope})) end commands.find = function(env, read, on_values, on_error, scope) - local function _681_(_241) - local _682_0 = nil + local function _687_(_241) + local _688_0 = nil do - local _683_0 = utils["sym?"](_241) - if (nil ~= _683_0) then - local _684_0 = resolve(_683_0, env, scope) - if (nil ~= _684_0) then - _682_0 = debug.getinfo(_684_0) + local _689_0 = utils["sym?"](_241) + if (nil ~= _689_0) then + local _690_0 = resolve(_689_0, env, scope) + if (nil ~= _690_0) then + _688_0 = debug.getinfo(_690_0) else - _682_0 = _684_0 + _688_0 = _690_0 end else - _682_0 = _683_0 + _688_0 = _689_0 end end - if ((_G.type(_682_0) == "table") and (nil ~= _682_0.linedefined) and (nil ~= _682_0.short_src) and (nil ~= _682_0.source) and (_682_0.what == "Lua")) then - local line = _682_0.linedefined - local src = _682_0.short_src - local source = _682_0.source + if ((_G.type(_688_0) == "table") and (nil ~= _688_0.linedefined) and (nil ~= _688_0.short_src) and (nil ~= _688_0.source) and (_688_0.what == "Lua")) then + local line = _688_0.linedefined + local src = _688_0.short_src + local source = _688_0.source local fnlsrc = nil do - local _687_0 = compiler.sourcemap - if (nil ~= _687_0) then - _687_0 = _687_0[source] + local _693_0 = compiler.sourcemap + if (nil ~= _693_0) then + _693_0 = _693_0[source] end - if (nil ~= _687_0) then - _687_0 = _687_0[line] + if (nil ~= _693_0) then + _693_0 = _693_0[line] end - if (nil ~= _687_0) then - _687_0 = _687_0[2] + if (nil ~= _693_0) then + _693_0 = _693_0[2] end - fnlsrc = _687_0 + fnlsrc = _693_0 end return on_values({string.format("%s:%s", src, (fnlsrc or line))}) - elseif (_682_0 == nil) then + elseif (_688_0 == nil) then return on_error("Repl", "Unknown value") else - local _ = _682_0 + local _ = _688_0 return on_error("Repl", "No source info") end end - return run_command(read, on_error, _681_) + return run_command(read, on_error, _687_) end do end (compiler.metadata):set(commands.find, "fnl/docstring", "Print the filename and line number for a given function") commands.doc = function(env, read, on_values, on_error, scope) - local function _692_(_241) + local function _698_(_241) local name = tostring(_241) local path = (utils["multi-sym?"](name) or {name}) local ok_3f, target = nil, nil - local function _693_() + local function _699_() return (utils["get-in"](scope.specials, path) or utils["get-in"](scope.macros, path) or resolve(name, env, scope)) end - ok_3f, target = pcall(_693_) + ok_3f, target = pcall(_699_) if ok_3f then return on_values({specials.doc(target, name)}) else return on_error("Repl", ("Could not find " .. name .. " for docs.")) end end - return run_command(read, on_error, _692_) + return run_command(read, on_error, _698_) end do end (compiler.metadata):set(commands.doc, "fnl/docstring", "Print the docstring and arglist for a function, macro, or special form.") commands.compile = function(env, read, on_values, on_error, scope) - local function _695_(_241) + local function _701_(_241) local allowedGlobals = specials["current-global-names"](env) local ok_3f, result = pcall(compiler.compile, _241, {allowedGlobals = allowedGlobals, env = env, scope = scope}) if ok_3f then @@ -500,15 +499,15 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return on_error("Repl", ("Error compiling expression: " .. result)) end end - return run_command(read, on_error, _695_) + return run_command(read, on_error, _701_) end do end (compiler.metadata):set(commands.compile, "fnl/docstring", "compiles the expression into lua and prints the result.") local function load_plugin_commands(plugins) for i = #(plugins or {}), 1, -1 do for name, f in pairs(plugins[i]) do - local _697_0 = name:match("^repl%-command%-(.*)") - if (nil ~= _697_0) then - local cmd_name = _697_0 + local _703_0 = name:match("^repl%-command%-(.*)") + if (nil ~= _703_0) then + local cmd_name = _703_0 commands[cmd_name] = f end end @@ -518,12 +517,12 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local function run_command_loop(input, read, loop, env, on_values, on_error, scope, chars) local command_name = input:match(",([^%s/]+)") do - local _699_0 = commands[command_name] - if (nil ~= _699_0) then - local command = _699_0 + local _705_0 = commands[command_name] + if (nil ~= _705_0) then + local command = _705_0 command(env, read, on_values, on_error, scope, chars) else - local _ = _699_0 + local _ = _705_0 if ((command_name ~= "exit") and (command_name ~= "return")) then on_values({"Unknown command", command_name}) end @@ -573,9 +572,9 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end local function repl(_3foptions) local old_root_options = utils.root.options - local _708_ = utils.copy(_3foptions) - local opts = _708_ - local _3ffennelrc = _708_["fennelrc"] + local _714_ = utils.copy(_3foptions) + local opts = _714_ + local _3ffennelrc = _714_["fennelrc"] local _ = nil opts.fennelrc = nil _ = nil @@ -590,20 +589,20 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) local callbacks = {env = env, onError = (opts.onError or default_on_error), onValues = (opts.onValues or default_on_values), pp = (opts.pp or view), readChunk = (opts.readChunk or default_read_chunk)} local save_locals_3f = (opts.saveLocals ~= false) local byte_stream, clear_stream = nil, nil - local function _710_(_241) + local function _716_(_241) return callbacks.readChunk(_241) end - byte_stream, clear_stream = parser.granulate(_710_) + byte_stream, clear_stream = parser.granulate(_716_) local chars = {} local read, reset = nil, nil - local function _711_(parser_state) + local function _717_(parser_state) local b = byte_stream(parser_state) if b then table.insert(chars, string.char(b)) end return b end - read, reset = parser.parser(_711_) + read, reset = parser.parser(_717_) depth = (depth + 1) if opts.message then callbacks.onValues({opts.message}) @@ -618,14 +617,14 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) opts.init(opts, depth) end if opts.registerCompleter then - local function _717_() - local _716_0 = opts.scope - local function _718_(...) - return completer(env, _716_0, ...) + local function _723_() + local _722_0 = opts.scope + local function _724_(...) + return completer(env, _722_0, ...) end - return _718_ + return _724_ end - opts.registerCompleter(_717_()) + opts.registerCompleter(_723_()) end load_plugin_commands(opts.plugins) if save_locals_3f then @@ -672,28 +671,28 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) return run_command_loop(src_string, read, loop, env, callbacks.onValues, callbacks.onError, opts.scope, chars) else if not_eof_3f then - local function _722_(...) - local _723_0, _724_0 = ... - if ((_723_0 == true) and (nil ~= _724_0)) then - local src = _724_0 - local function _725_(...) - local _726_0, _727_0 = ... - if ((_726_0 == true) and (nil ~= _727_0)) then - local chunk = _727_0 - local function _728_() + local function _728_(...) + local _729_0, _730_0 = ... + if ((_729_0 == true) and (nil ~= _730_0)) then + local src = _730_0 + local function _731_(...) + local _732_0, _733_0 = ... + if ((_732_0 == true) and (nil ~= _733_0)) then + local chunk = _733_0 + local function _734_() return print_values(save_value(chunk())) end - local function _729_(...) + local function _735_(...) return callbacks.onError("Runtime", ...) end - return xpcall(_728_, _729_) - elseif ((_726_0 == false) and (nil ~= _727_0)) then - local msg = _727_0 + return xpcall(_734_, _735_) + elseif ((_732_0 == false) and (nil ~= _733_0)) then + local msg = _733_0 clear_stream() return callbacks.onError("Compile", msg) end end - local function _732_(...) + local function _738_(...) local src0 = nil if save_locals_3f then src0 = splice_save_locals(env, src, opts.scope) @@ -702,18 +701,18 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end return pcall(specials["load-code"], src0, env) end - return _725_(_732_(...)) - elseif ((_723_0 == false) and (nil ~= _724_0)) then - local msg = _724_0 + return _731_(_738_(...)) + elseif ((_729_0 == false) and (nil ~= _730_0)) then + local msg = _730_0 clear_stream() return callbacks.onError("Compile", msg) end end - local function _734_() + local function _740_() opts["source"] = src_string return opts end - _722_(pcall(compiler.compile, form, _734_())) + _728_(pcall(compiler.compile, form, _740_())) utils.root.options = old_root_options if exit_next_3f then return env.___replLocals___["*1"] @@ -733,7 +732,10 @@ package.preload["fennel.repl"] = package.preload["fennel.repl"] or function(...) end return value end - return repl + local function _746_(overrides, _3fopts) + return repl(utils.copy(_3fopts, utils.copy(overrides))) + end + return setmetatable({}, {__call = _746_, __index = {repl = repl}}) end package.preload["fennel.specials"] = package.preload["fennel.specials"] or function(...) local utils = require("fennel.utils") @@ -743,14 +745,14 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local unpack = (table.unpack or _G.unpack) local SPECIALS = compiler.scopes.global.specials local function wrap_env(env) - local function _417_(_, key) + local function _420_(_, key) if utils["string?"](key) then return env[compiler["global-unmangling"](key)] else return env[key] end end - local function _419_(_, key, value) + local function _422_(_, key, value) if utils["string?"](key) then env[compiler["global-unmangling"](key)] = value return nil @@ -759,26 +761,29 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return nil end end - local function _421_() + local function _424_() local function putenv(k, v) - local _422_ + local _425_ if utils["string?"](k) then - _422_ = compiler["global-unmangling"](k) + _425_ = compiler["global-unmangling"](k) else - _422_ = k + _425_ = k end - return _422_, v + return _425_, v end return next, utils.kvmap(env, putenv), nil end - return setmetatable({}, {__index = _417_, __newindex = _419_, __pairs = _421_}) + return setmetatable({}, {__index = _420_, __newindex = _422_, __pairs = _424_}) + end + local function fennel_module_name() + return (utils.root.options.moduleName or "fennel") end local function current_global_names(_3fenv) local mt = nil do - local _424_0 = getmetatable(_3fenv) - if ((_G.type(_424_0) == "table") and (nil ~= _424_0.__pairs)) then - local mtpairs = _424_0.__pairs + local _427_0 = getmetatable(_3fenv) + if ((_G.type(_427_0) == "table") and (nil ~= _427_0.__pairs)) then + local mtpairs = _427_0.__pairs local tbl_14_ = {} for k, v in mtpairs(_3fenv) do local k_15_, v_16_ = k, v @@ -787,7 +792,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end mt = tbl_14_ - elseif (_424_0 == nil) then + elseif (_427_0 == nil) then mt = (_3fenv or _G) else mt = nil @@ -797,15 +802,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local function load_code(code, _3fenv, _3ffilename) local env = (_3fenv or rawget(_G, "_ENV") or _G) - local _427_0, _428_0 = rawget(_G, "setfenv"), rawget(_G, "loadstring") - if ((nil ~= _427_0) and (nil ~= _428_0)) then - local setfenv = _427_0 - local loadstring = _428_0 + local _430_0, _431_0 = rawget(_G, "setfenv"), rawget(_G, "loadstring") + if ((nil ~= _430_0) and (nil ~= _431_0)) then + local setfenv = _430_0 + local loadstring = _431_0 local f = assert(loadstring(code, _3ffilename)) setfenv(f, env) return f else - local _ = _427_0 + local _ = _430_0 return assert(load(code, _3ffilename, "t", env)) end end @@ -817,13 +822,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local mt = getmetatable(tgt) if ((type(tgt) == "function") or ((type(mt) == "table") and (type(mt.__call) == "function"))) then local arglist = table.concat(((compiler.metadata):get(tgt, "fnl/arglist") or {"#"}), " ") - local _430_ + local _433_ if (0 < #arglist) then - _430_ = " " + _433_ = " " else - _430_ = "" + _433_ = "" end - return string.format("(%s%s%s)\n %s", name, _430_, arglist, docstring) + return string.format("(%s%s%s)\n %s", name, _433_, arglist, docstring) else return string.format("%s\n %s", name, docstring) end @@ -933,9 +938,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local opts = {nval = 1, tail = false} local scope = compiler["make-scope"]() local chunk = {} - local _440_ = compiler.compile1(v, scope, chunk, opts) - local _441_ = _440_[1] - local v0 = _441_[1] + local _443_ = compiler.compile1(v, scope, chunk, opts) + local _444_ = _443_[1] + local v0 = _444_[1] return v0 end local function insert_meta(meta, k, v) @@ -943,23 +948,23 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.assert((type(k) == "string"), ("expected string keys in metadata table, got: %s"):format(view(k, view_opts))) compiler.assert(literal_3f(v), ("expected literal value in metadata table, got: %s %s"):format(view(k, view_opts), view(v, view_opts))) table.insert(meta, view(k)) - local function _442_() + local function _445_() if ("string" == type(v)) then return view(v, view_opts) else return compile_value(v) end end - table.insert(meta, _442_()) + table.insert(meta, _445_()) return meta end local function insert_arglist(meta, arg_list) local view_opts = {["escape-newlines?"] = true, ["line-length"] = math.huge, ["one-line?"] = true} table.insert(meta, "\"fnl/arglist\"") - local function _443_(_241) + local function _446_(_241) return view(view(_241, view_opts)) end - table.insert(meta, ("{" .. table.concat(utils.map(arg_list, _443_), ", ") .. "}")) + table.insert(meta, ("{" .. table.concat(utils.map(arg_list, _446_), ", ") .. "}")) return meta end local function set_fn_metadata(f_metadata, parent, fn_name) @@ -972,19 +977,19 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct insert_meta(meta_fields, k, v) end end - local meta_str = ("require(\"%s\").metadata"):format((utils.root.options.moduleName or "fennel")) + local meta_str = ("require(\"%s\").metadata"):format(fennel_module_name()) return compiler.emit(parent, ("pcall(function() %s:setall(%s, %s) end)"):format(meta_str, fn_name, table.concat(meta_fields, ", "))) end end local function get_fn_name(ast, scope, fn_name, multi) if (fn_name and (fn_name[1] ~= "nil")) then - local _446_ + local _449_ if not multi then - _446_ = compiler["declare-local"](fn_name, {}, scope, ast) + _449_ = compiler["declare-local"](fn_name, {}, scope, ast) else - _446_ = compiler["symbol-to-expression"](fn_name, scope)[1] + _449_ = compiler["symbol-to-expression"](fn_name, scope)[1] end - return _446_, not multi, 3 + return _449_, not multi, 3 else return nil, true, 2 end @@ -994,13 +999,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct for i = (index + 1), #ast do compiler.compile1(ast[i], f_scope, f_chunk, {nval = (((i ~= #ast) and 0) or nil), tail = (i == #ast)}) end - local _449_ + local _452_ if local_3f then - _449_ = "local function %s(%s)" + _452_ = "local function %s(%s)" else - _449_ = "%s = function(%s)" + _452_ = "%s = function(%s)" end - compiler.emit(parent, string.format(_449_, fn_name, table.concat(arg_name_list, ", ")), ast) + compiler.emit(parent, string.format(_452_, fn_name, table.concat(arg_name_list, ", ")), ast) compiler.emit(parent, f_chunk, ast) compiler.emit(parent, "end", ast) set_fn_metadata(f_metadata, parent, fn_name) @@ -1022,7 +1027,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end local function get_function_metadata(ast, arg_list, index) - local function _452_(_241, _242) + local function _455_(_241, _242) local tbl_14_ = _241 for k, v in pairs(_242) do local k_15_, v_16_ = k, v @@ -1032,18 +1037,18 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return tbl_14_ end - local function _454_(_241, _242) + local function _457_(_241, _242) _241["fnl/docstring"] = _242 return _241 end - return maybe_metadata(ast, utils["kv-table?"], _452_, maybe_metadata(ast, utils["string?"], _454_, {["fnl/arglist"] = arg_list}, index)) + return maybe_metadata(ast, utils["kv-table?"], _455_, maybe_metadata(ast, utils["string?"], _457_, {["fnl/arglist"] = arg_list}, index)) end SPECIALS.fn = function(ast, scope, parent) local f_scope = nil do - local _455_0 = compiler["make-scope"](scope) - _455_0["vararg"] = false - f_scope = _455_0 + local _458_0 = compiler["make-scope"](scope) + _458_0["vararg"] = false + f_scope = _458_0 end local f_chunk = {} local fn_sym = utils["sym?"](ast[2]) @@ -1103,36 +1108,37 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct doc_special("fn", {"name?", "args", "docstring?", "..."}, "Function syntax. May optionally include a name and docstring or a metadata table.\nIf a name is provided, the function will be bound in the current scope.\nWhen called with the wrong number of args, excess args will be discarded\nand lacking args will be nil, use lambda for arity-checked functions.", true) SPECIALS.lua = function(ast, _, parent) compiler.assert(((#ast == 2) or (#ast == 3)), "expected 1 or 2 arguments", ast) - local _460_ + local _463_ do - local _459_0 = utils["sym?"](ast[2]) - if (nil ~= _459_0) then - _460_ = tostring(_459_0) + local _462_0 = utils["sym?"](ast[2]) + if (nil ~= _462_0) then + _463_ = tostring(_462_0) else - _460_ = _459_0 + _463_ = _462_0 end end - if ("nil" ~= _460_) then + if ("nil" ~= _463_) then table.insert(parent, {ast = ast, leaf = tostring(ast[2])}) end - local _464_ + local _467_ do - local _463_0 = utils["sym?"](ast[3]) - if (nil ~= _463_0) then - _464_ = tostring(_463_0) + local _466_0 = utils["sym?"](ast[3]) + if (nil ~= _466_0) then + _467_ = tostring(_466_0) else - _464_ = _463_0 + _467_ = _466_0 end end - if ("nil" ~= _464_) then + if ("nil" ~= _467_) then return tostring(ast[3]) end end local function dot(ast, scope, parent) compiler.assert((1 < #ast), "expected table argument", ast) local len = #ast - local _467_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local lhs = _467_[1] + local lhs_node = compiler.macroexpand(ast[2], scope) + local _470_ = compiler.compile1(lhs_node, scope, parent, {nval = 1}) + local lhs = _470_[1] if (len == 2) then return tostring(lhs) else @@ -1142,12 +1148,12 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct if (utils["string?"](index) and utils["valid-lua-identifier?"](index)) then table.insert(indices, ("." .. index)) else - local _468_ = compiler.compile1(index, scope, parent, {nval = 1}) - local index0 = _468_[1] + local _471_ = compiler.compile1(index, scope, parent, {nval = 1}) + local index0 = _471_[1] table.insert(indices, ("[" .. tostring(index0) .. "]")) end end - if (not (utils["sym?"](ast[2]) or utils["list?"](ast[2])) or ("nil" == tostring(lhs))) then + if (not (utils["sym?"](lhs_node) or utils["list?"](lhs_node)) or ("nil" == tostring(lhs_node))) then return ("(" .. tostring(lhs) .. ")" .. table.concat(indices)) else return (tostring(lhs) .. table.concat(indices)) @@ -1188,7 +1194,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end doc_special("var", {"name", "val"}, "Introduce new mutable local.") local function kv_3f(t) - local _472_ + local _475_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -1204,9 +1210,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct tbl_17_[i_18_] = val_19_ end end - _472_ = tbl_17_ + _475_ = tbl_17_ end - return _472_[1] + return _475_[1] end SPECIALS.let = function(ast, scope, parent, opts) local bindings = ast[2] @@ -1233,22 +1239,22 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end local function disambiguate_3f(rootstr, parent) - local function _477_() - local _476_0 = get_prev_line(parent) - if (nil ~= _476_0) then - local prev_line = _476_0 + local function _480_() + local _479_0 = get_prev_line(parent) + if (nil ~= _479_0) then + local prev_line = _479_0 return prev_line:match("%)$") end end - return (rootstr:match("^{") or rootstr:match("^%(") or _477_()) + return (rootstr:match("^{") or rootstr:match("^%(") or _480_()) end SPECIALS.tset = function(ast, scope, parent) compiler.assert((3 < #ast), "expected table, key, and value arguments", ast) local root = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] local keys = {} for i = 3, (#ast - 1) do - local _479_ = compiler.compile1(ast[i], scope, parent, {nval = 1}) - local key = _479_[1] + local _482_ = compiler.compile1(ast[i], scope, parent, {nval = 1}) + local key = _482_[1] table.insert(keys, tostring(key)) end local value = compiler.compile1(ast[#ast], scope, parent, {nval = 1})[1] @@ -1366,32 +1372,56 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end SPECIALS["if"] = if_2a doc_special("if", {"cond1", "body1", "...", "condN", "bodyN"}, "Conditional form.\nTakes any number of condition/body pairs and evaluates the first body where\nthe condition evaluates to truthy. Similar to cond in other lisps.") - local function remove_until_condition(bindings) - local last_item = bindings[(#bindings - 1)] - if ((utils["sym?"](last_item) and (tostring(last_item) == "&until")) or ("until" == last_item)) then - table.remove(bindings, (#bindings - 1)) - return table.remove(bindings) + local function clause_3f(v) + return (utils["string?"](v) or (utils["sym?"](v) and not utils["multi-sym?"](v) and tostring(v):match("^&(.+)"))) + end + local function remove_until_condition(bindings, ast) + local _until = nil + for i = (#bindings - 1), 3, -1 do + local _492_0 = clause_3f(bindings[i]) + if ((_492_0 == false) or (_492_0 == nil)) then + elseif (nil ~= _492_0) then + local clause = _492_0 + compiler.assert(((clause == "until") and not _until), ("unexpected iterator clause: " .. clause), ast) + table.remove(bindings, i) + _until = table.remove(bindings, i) + end end + return _until end local function compile_until(_3fcondition, scope, chunk) if _3fcondition then - local _490_ = compiler.compile1(_3fcondition, scope, chunk, {nval = 1}) - local condition_lua = _490_[1] + local _494_ = compiler.compile1(_3fcondition, scope, chunk, {nval = 1}) + local condition_lua = _494_[1] return compiler.emit(chunk, ("if %s then break end"):format(tostring(condition_lua)), utils.expr(_3fcondition, "expression")) end end + local function iterator_bindings(ast) + local bindings = utils.copy(ast) + local _3funtil = remove_until_condition(bindings, ast) + local iter = table.remove(bindings) + local bindings0 = nil + if (1 == #bindings) then + bindings0 = (utils["list?"](bindings[1]) or bindings) + else + for _, b in ipairs(bindings) do + if utils["list?"](b) then + utils.warn("unexpected parens in iterator", b) + end + end + bindings0 = bindings + end + return bindings0, iter, _3funtil + end SPECIALS.each = function(ast, scope, parent) compiler.assert((3 <= #ast), "expected body expression", ast[1]) compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) - local binding = setmetatable(utils.copy(ast[2]), getmetatable(ast[2])) local sub_scope = compiler["make-scope"](scope) - local _3funtil_condition = remove_until_condition(binding) - local iter = table.remove(binding, #binding) + local binding, iter, _3funtil_condition = iterator_bindings(ast[2]) local destructures = {} local new_manglings = {} utils.hook("pre-each", ast, sub_scope, binding, iter, _3funtil_condition) local function destructure_binding(v) - compiler.assert(not utils["string?"](v), ("unexpected iterator clause " .. tostring(v)), binding) if utils["sym?"](v) then return compiler["declare-local"](v, {}, sub_scope, ast, new_manglings) else @@ -1440,7 +1470,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function for_2a(ast, scope, parent) compiler.assert(utils["table?"](ast[2]), "expected binding table", ast) local ranges = setmetatable(utils.copy(ast[2]), getmetatable(ast[2])) - local until_condition = remove_until_condition(ranges) + local until_condition = remove_until_condition(ranges, ast) local binding_sym = table.remove(ranges, 1) local sub_scope = compiler["make-scope"](scope) local range_args = {} @@ -1462,10 +1492,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct SPECIALS["for"] = for_2a doc_special("for", {"[index start stop step?]", "..."}, "Numeric loop construct.\nEvaluates body once for each value between start and stop (inclusive).", true) local function native_method_call(ast, _scope, _parent, target, args) - local _494_ = ast - local _ = _494_[1] - local _0 = _494_[2] - local method_string = _494_[3] + local _500_ = ast + local _ = _500_[1] + local _0 = _500_[2] + local method_string = _500_[3] local call_string = nil if ((target.type == "literal") or (target.type == "varg") or (target.type == "expression")) then call_string = "(%s):%s(%s)" @@ -1487,18 +1517,18 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local function method_call(ast, scope, parent) compiler.assert((2 < #ast), "expected at least 2 arguments", ast) - local _496_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local target = _496_[1] + local _502_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local target = _502_[1] local args = {} for i = 4, #ast do local subexprs = nil - local _497_ + local _503_ if (i ~= #ast) then - _497_ = 1 + _503_ = 1 else - _497_ = nil + _503_ = nil end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _497_}) + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _503_}) utils.map(subexprs, tostring, args) end if (utils["string?"](ast[3]) and utils["valid-lua-identifier?"](ast[3])) then @@ -1513,7 +1543,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct doc_special(":", {"tbl", "method-name", "..."}, "Call the named method on tbl with the provided args.\nMethod name doesn't have to be known at compile-time; if it is, use\n(tbl:method-name ...) instead.") SPECIALS.comment = function(ast, _, parent) local c = nil - local _500_ + local _506_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -1529,9 +1559,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct tbl_17_[i_18_] = val_19_ end end - _500_ = tbl_17_ + _506_ = tbl_17_ end - c = table.concat(_500_, " "):gsub("%]%]", "]\\]") + c = table.concat(_506_, " "):gsub("%]%]", "]\\]") return compiler.emit(parent, ("--[[ " .. c .. " ]]"), ast) end doc_special("comment", {"..."}, "Comment which will be emitted in Lua output.", true) @@ -1552,10 +1582,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.assert((#ast == 2), "expected one argument", ast) local f_scope = nil do - local _505_0 = compiler["make-scope"](scope) - _505_0["vararg"] = false - _505_0["hashfn"] = true - f_scope = _505_0 + local _511_0 = compiler["make-scope"](scope) + _511_0["vararg"] = false + _511_0["hashfn"] = true + f_scope = _511_0 end local f_chunk = {} local name = compiler.gensym(scope) @@ -1596,9 +1626,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return utils.expr(name, "sym") end doc_special("hashfn", {"..."}, "Function literal shorthand; args are either $... OR $1, $2, etc.") - local function maybe_short_circuit_protect(ast, i, name, _510_0) - local _511_ = _510_0 - local mac = _511_["macros"] + local function maybe_short_circuit_protect(ast, i, name, _516_0) + local _517_ = _516_0 + local mac = _517_["macros"] local call = (utils["list?"](ast) and tostring(ast[1])) if ((("or" == name) or ("and" == name)) and (1 < i) and (mac[call] or ("set" == call) or ("tset" == call) or ("global" == call))) then return utils.list(utils.list(utils.sym("fn"), utils.sequence(utils.varg()), ast)) @@ -1619,15 +1649,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct table.insert(operands, tostring(subexprs[1])) end end - local _514_0 = #operands - if (_514_0 == 0) then - local _515_ + local _520_0 = #operands + if (_520_0 == 0) then + local _521_ do compiler.assert(zero_arity, "Expected more than 0 arguments", ast) - _515_ = zero_arity + _521_ = zero_arity end - return utils.expr(_515_, "literal") - elseif (_514_0 == 1) then + return utils.expr(_521_, "literal") + elseif (_520_0 == 1) then if utils["varg?"](ast[2]) then return compiler.assert(false, "tried to use vararg with operator", ast) elseif unary_prefix then @@ -1636,20 +1666,20 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return operands[1] end else - local _ = _514_0 + local _ = _520_0 return ("(" .. table.concat(operands, padded_op) .. ")") end end local function define_arithmetic_special(name, zero_arity, unary_prefix, _3flua_name) - local _519_ + local _525_ do - local _518_0 = (_3flua_name or name) - local function _520_(...) - return operator_special(_518_0, zero_arity, unary_prefix, ...) + local _524_0 = (_3flua_name or name) + local function _526_(...) + return operator_special(_524_0, zero_arity, unary_prefix, ...) end - _519_ = _520_ + _525_ = _526_ end - SPECIALS[name] = _519_ + SPECIALS[name] = _525_ return doc_special(name, {"a", "b", "..."}, "Arithmetic operator; works the same as Lua but accepts more arguments.") end define_arithmetic_special("+", "0") @@ -1678,13 +1708,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local prefixed_lib_name = ("bit." .. lib_name) for i = 2, len do local subexprs = nil - local _521_ + local _527_ if (i ~= len) then - _521_ = 1 + _527_ = 1 else - _521_ = nil + _527_ = nil end - subexprs = compiler.compile1(ast[i], scope, parent, {nval = _521_}) + subexprs = compiler.compile1(ast[i], scope, parent, {nval = _527_}) utils.map(subexprs, tostring, operands) end if (#operands == 1) then @@ -1703,15 +1733,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end local function define_bitop_special(name, zero_arity, unary_prefix, native) - local function _527_(...) + local function _533_(...) return bitop_special(native, name, zero_arity, unary_prefix, ...) end - SPECIALS[name] = _527_ + SPECIALS[name] = _533_ return nil end define_bitop_special("lshift", nil, "1", "<<") define_bitop_special("rshift", nil, "1", ">>") - define_bitop_special("band", "0", "0", "&") + define_bitop_special("band", "-1", "-1", "&") define_bitop_special("bor", "0", "0", "|") define_bitop_special("bxor", "0", "0", "~") doc_special("lshift", {"x", "n"}, "Bitwise logical left shift of x by n bits.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") @@ -1721,8 +1751,8 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct doc_special("bxor", {"x1", "x2", "..."}, "Bitwise XOR of any number of arguments.\nOnly works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") SPECIALS.bnot = function(ast, scope, parent) compiler.assert((#ast == 2), "expected one argument", ast) - local _528_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) - local value = _528_[1] + local _534_ = compiler.compile1(ast[2], scope, parent, {nval = 1}) + local value = _534_[1] if utils.root.options.useBitLib then return ("bit.bnot(" .. tostring(value) .. ")") else @@ -1731,15 +1761,15 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end doc_special("bnot", {"x"}, "Bitwise negation; only works in Lua 5.3+ or LuaJIT with the --use-bit-lib flag.") doc_special("..", {"a", "b", "..."}, "String concatenation operator; works the same as Lua but accepts more arguments.") - local function native_comparator(op, _530_0, scope, parent) - local _531_ = _530_0 - local _ = _531_[1] - local lhs_ast = _531_[2] - local rhs_ast = _531_[3] - local _532_ = compiler.compile1(lhs_ast, scope, parent, {nval = 1}) - local lhs = _532_[1] - local _533_ = compiler.compile1(rhs_ast, scope, parent, {nval = 1}) - local rhs = _533_[1] + local function native_comparator(op, _536_0, scope, parent) + local _537_ = _536_0 + local _ = _537_[1] + local lhs_ast = _537_[2] + local rhs_ast = _537_[3] + local _538_ = compiler.compile1(lhs_ast, scope, parent, {nval = 1}) + local lhs = _538_[1] + local _539_ = compiler.compile1(rhs_ast, scope, parent, {nval = 1}) + local rhs = _539_[1] return string.format("(%s %s %s)", tostring(lhs), op, tostring(rhs)) end local function idempotent_comparator(op, chain_op, ast, scope, parent) @@ -1852,21 +1882,21 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local safe_require = nil local function safe_compiler_env() - local _540_ + local _546_ do - local _539_0 = rawget(_G, "utf8") - if (nil ~= _539_0) then - _540_ = utils.copy(_539_0) + local _545_0 = rawget(_G, "utf8") + if (nil ~= _545_0) then + _546_ = utils.copy(_545_0) else - _540_ = _539_0 + _546_ = _545_0 end end - return {_VERSION = _VERSION, assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = utils.stablepairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, require = safe_require, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, utf8 = _540_, xpcall = xpcall} + return {_VERSION = _VERSION, assert = assert, bit = rawget(_G, "bit"), error = error, getmetatable = safe_getmetatable, ipairs = ipairs, math = utils.copy(math), next = next, pairs = utils.stablepairs, pcall = pcall, print = print, rawequal = rawequal, rawget = rawget, rawlen = rawget(_G, "rawlen"), rawset = rawset, require = safe_require, select = select, setmetatable = setmetatable, string = utils.copy(string), table = utils.copy(table), tonumber = tonumber, tostring = tostring, type = type, utf8 = _546_, xpcall = xpcall} end local function combined_mt_pairs(env) local combined = {} - local _542_ = getmetatable(env) - local __index = _542_["__index"] + local _548_ = getmetatable(env) + local __index = _548_["__index"] if ("table" == type(__index)) then for k, v in pairs(__index) do combined[k] = v @@ -1880,40 +1910,40 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function make_compiler_env(ast, scope, parent, _3fopts) local provided = nil do - local _544_0 = (_3fopts or utils.root.options) - if ((_G.type(_544_0) == "table") and (_544_0["compiler-env"] == "strict")) then + local _550_0 = (_3fopts or utils.root.options) + if ((_G.type(_550_0) == "table") and (_550_0["compiler-env"] == "strict")) then provided = safe_compiler_env() - elseif ((_G.type(_544_0) == "table") and (nil ~= _544_0.compilerEnv)) then - local compilerEnv = _544_0.compilerEnv + elseif ((_G.type(_550_0) == "table") and (nil ~= _550_0.compilerEnv)) then + local compilerEnv = _550_0.compilerEnv provided = compilerEnv - elseif ((_G.type(_544_0) == "table") and (nil ~= _544_0["compiler-env"])) then - local compiler_env = _544_0["compiler-env"] + elseif ((_G.type(_550_0) == "table") and (nil ~= _550_0["compiler-env"])) then + local compiler_env = _550_0["compiler-env"] provided = compiler_env else - local _ = _544_0 + local _ = _550_0 provided = safe_compiler_env() end end local env = nil - local function _546_() + local function _552_() return compiler.scopes.macro end - local function _547_(symbol) + local function _553_(symbol) compiler.assert(compiler.scopes.macro, "must call from macro", ast) return compiler.scopes.macro.manglings[tostring(symbol)] end - local function _548_(base) + local function _554_(base) return utils.sym(compiler.gensym((compiler.scopes.macro or scope), base)) end - local function _549_(form) + local function _555_(form) compiler.assert(compiler.scopes.macro, "must call from macro", ast) return compiler.macroexpand(form, compiler.scopes.macro) end - env = {["assert-compile"] = compiler.assert, ["ast-source"] = utils["ast-source"], ["comment?"] = utils["comment?"], ["get-scope"] = _546_, ["in-scope?"] = _547_, ["list?"] = utils["list?"], ["macro-loaded"] = macro_loaded, ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), comment = utils.comment, gensym = _548_, list = utils.list, macroexpand = _549_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, version = utils.version, view = view} + env = {["assert-compile"] = compiler.assert, ["ast-source"] = utils["ast-source"], ["comment?"] = utils["comment?"], ["fennel-module-name"] = fennel_module_name, ["get-scope"] = _552_, ["in-scope?"] = _553_, ["list?"] = utils["list?"], ["macro-loaded"] = macro_loaded, ["multi-sym?"] = utils["multi-sym?"], ["sequence?"] = utils["sequence?"], ["sym?"] = utils["sym?"], ["table?"] = utils["table?"], ["varg?"] = utils["varg?"], _AST = ast, _CHUNK = parent, _IS_COMPILER = true, _SCOPE = scope, _SPECIALS = compiler.scopes.global.specials, _VARARG = utils.varg(), comment = utils.comment, gensym = _554_, list = utils.list, macroexpand = _555_, sequence = utils.sequence, sym = utils.sym, unpack = unpack, version = utils.version, view = view} env._G = env return setmetatable(env, {__index = provided, __newindex = provided, __pairs = combined_mt_pairs}) end - local function _550_(...) + local function _556_(...) local tbl_17_ = {} local i_18_ = #tbl_17_ for c in string.gmatch((package.config or ""), "([^\n]+)") do @@ -1925,10 +1955,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return tbl_17_ end - local _552_ = _550_(...) - local dirsep = _552_[1] - local pathsep = _552_[2] - local pathmark = _552_[3] + local _558_ = _556_(...) + local dirsep = _558_[1] + local pathsep = _558_[2] + local pathmark = _558_[3] local pkg_config = {dirsep = (dirsep or "/"), pathmark = (pathmark or "?"), pathsep = (pathsep or ";")} local function escapepat(str) return string.gsub(str, "[^%w]", "%%%1") @@ -1941,36 +1971,36 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function try_path(path) local filename = path:gsub(escapepat(pkg_config.pathmark), no_dot_module) local filename2 = path:gsub(escapepat(pkg_config.pathmark), modulename) - local _553_0 = (io.open(filename) or io.open(filename2)) - if (nil ~= _553_0) then - local file = _553_0 + local _559_0 = (io.open(filename) or io.open(filename2)) + if (nil ~= _559_0) then + local file = _559_0 file:close() return filename else - local _ = _553_0 + local _ = _559_0 return nil, ("no file '" .. filename .. "'") end end local function find_in_path(start, _3ftried_paths) - local _555_0 = fullpath:match(pattern, start) - if (nil ~= _555_0) then - local path = _555_0 - local _556_0, _557_0 = try_path(path) - if (nil ~= _556_0) then - local filename = _556_0 + local _561_0 = fullpath:match(pattern, start) + if (nil ~= _561_0) then + local path = _561_0 + local _562_0, _563_0 = try_path(path) + if (nil ~= _562_0) then + local filename = _562_0 return filename - elseif ((_556_0 == nil) and (nil ~= _557_0)) then - local error = _557_0 - local function _559_() - local _558_0 = (_3ftried_paths or {}) - table.insert(_558_0, error) - return _558_0 + elseif ((_562_0 == nil) and (nil ~= _563_0)) then + local error = _563_0 + local function _565_() + local _564_0 = (_3ftried_paths or {}) + table.insert(_564_0, error) + return _564_0 end - return find_in_path((start + #path + 1), _559_()) + return find_in_path((start + #path + 1), _565_()) end else - local _ = _555_0 - local function _561_() + local _ = _561_0 + local function _567_() local tried_paths = table.concat((_3ftried_paths or {}), "\n\9") if (_VERSION < "Lua 5.4") then return ("\n\9" .. tried_paths) @@ -1978,31 +2008,31 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return tried_paths end end - return nil, _561_() + return nil, _567_() end end return find_in_path(1) end local function make_searcher(_3foptions) - local function _564_(module_name) + local function _570_(module_name) local opts = utils.copy(utils.root.options) for k, v in pairs((_3foptions or {})) do opts[k] = v end opts["module-name"] = module_name - local _565_0, _566_0 = search_module(module_name) - if (nil ~= _565_0) then - local filename = _565_0 - local function _567_(...) + local _571_0, _572_0 = search_module(module_name) + if (nil ~= _571_0) then + local filename = _571_0 + local function _573_(...) return utils["fennel-module"].dofile(filename, opts, ...) end - return _567_, filename - elseif ((_565_0 == nil) and (nil ~= _566_0)) then - local error = _566_0 + return _573_, filename + elseif ((_571_0 == nil) and (nil ~= _572_0)) then + local error = _572_0 return error end end - return _564_ + return _570_ end local function dofile_with_searcher(fennel_macro_searcher, filename, opts, ...) local searchers = (package.loaders or package.searchers or {}) @@ -2014,35 +2044,35 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct local function fennel_macro_searcher(module_name) local opts = nil do - local _569_0 = utils.copy(utils.root.options) - _569_0["module-name"] = module_name - _569_0["env"] = "_COMPILER" - _569_0["requireAsInclude"] = false - _569_0["allowedGlobals"] = nil - opts = _569_0 + local _575_0 = utils.copy(utils.root.options) + _575_0["module-name"] = module_name + _575_0["env"] = "_COMPILER" + _575_0["requireAsInclude"] = false + _575_0["allowedGlobals"] = nil + opts = _575_0 end - local _570_0 = search_module(module_name, utils["fennel-module"]["macro-path"]) - if (nil ~= _570_0) then - local filename = _570_0 - local _571_ + local _576_0 = search_module(module_name, utils["fennel-module"]["macro-path"]) + if (nil ~= _576_0) then + local filename = _576_0 + local _577_ if (opts["compiler-env"] == _G) then - local function _572_(...) + local function _578_(...) return dofile_with_searcher(fennel_macro_searcher, filename, opts, ...) end - _571_ = _572_ + _577_ = _578_ else - local function _573_(...) + local function _579_(...) return utils["fennel-module"].dofile(filename, opts, ...) end - _571_ = _573_ + _577_ = _579_ end - return _571_, filename + return _577_, filename end end local function lua_macro_searcher(module_name) - local _576_0 = search_module(module_name, package.path) - if (nil ~= _576_0) then - local filename = _576_0 + local _582_0 = search_module(module_name, package.path) + if (nil ~= _582_0) then + local filename = _582_0 local code = nil do local f = io.open(filename) @@ -2054,10 +2084,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return error(..., 0) end end - local function _578_() + local function _584_() return assert(f:read("*a")) end - code = close_handlers_10_(_G.xpcall(_578_, (package.loaded.fennel or debug).traceback)) + code = close_handlers_10_(_G.xpcall(_584_, (package.loaded.fennel or debug).traceback)) end local chunk = load_code(code, make_compiler_env(), filename) return chunk, filename @@ -2065,38 +2095,38 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end local macro_searchers = {fennel_macro_searcher, lua_macro_searcher} local function search_macro_module(modname, n) - local _580_0 = macro_searchers[n] - if (nil ~= _580_0) then - local f = _580_0 - local _581_0, _582_0 = f(modname) - if ((nil ~= _581_0) and true) then - local loader = _581_0 - local _3ffilename = _582_0 + local _586_0 = macro_searchers[n] + if (nil ~= _586_0) then + local f = _586_0 + local _587_0, _588_0 = f(modname) + if ((nil ~= _587_0) and true) then + local loader = _587_0 + local _3ffilename = _588_0 return loader, _3ffilename else - local _ = _581_0 + local _ = _587_0 return search_macro_module(modname, (n + 1)) end end end local function sandbox_fennel_module(modname) if ((modname == "fennel.macros") or (package and package.loaded and ("table" == type(package.loaded[modname])) and (package.loaded[modname].metadata == compiler.metadata))) then - local function _585_(_, ...) + local function _591_(_, ...) return (compiler.metadata):setall(...) end - return {metadata = {setall = _585_}, view = view} + return {metadata = {setall = _591_}, view = view} end end - local function _587_(modname) - local function _588_() + local function _593_(modname) + local function _594_() local loader, filename = search_macro_module(modname, 1) compiler.assert(loader, (modname .. " module not found.")) macro_loaded[modname] = loader(modname, filename) return macro_loaded[modname] end - return (macro_loaded[modname] or sandbox_fennel_module(modname) or _588_()) + return (macro_loaded[modname] or sandbox_fennel_module(modname) or _594_()) end - safe_require = _587_ + safe_require = _593_ local function add_macros(macros_2a, ast, scope) compiler.assert(utils["table?"](macros_2a), "expected macros to be table", ast) for k, v in pairs(macros_2a) do @@ -2106,10 +2136,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end return nil end - local function resolve_module_name(_589_0, _scope, _parent, opts) - local _590_ = _589_0 - local second = _590_[2] - local filename = _590_["filename"] + local function resolve_module_name(_595_0, _scope, _parent, opts) + local _596_ = _595_0 + local second = _596_[2] + local filename = _596_["filename"] local filename0 = (filename or (utils["table?"](second) and second.filename)) local module_name = utils.root.options["module-name"] local modexpr = compiler.compile(second, opts) @@ -2166,10 +2196,10 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return error(..., 0) end end - local function _596_() + local function _602_() return assert(f:read("*all")):gsub("[\13\n]*$", "") end - src = close_handlers_10_(_G.xpcall(_596_, (package.loaded.fennel or debug).traceback)) + src = close_handlers_10_(_G.xpcall(_602_, (package.loaded.fennel or debug).traceback)) end local ret = utils.expr(("require(\"" .. mod .. "\")"), "statement") local target = ("package.preload[%q]"):format(mod) @@ -2199,12 +2229,12 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct compiler.assert((#ast == 2), "expected one argument", ast) local modexpr = nil do - local _599_0, _600_0 = pcall(resolve_module_name, ast, scope, parent, opts) - if ((_599_0 == true) and (nil ~= _600_0)) then - local modname = _600_0 + local _605_0, _606_0 = pcall(resolve_module_name, ast, scope, parent, opts) + if ((_605_0 == true) and (nil ~= _606_0)) then + local modname = _606_0 modexpr = utils.expr(string.format("%q", modname), "literal") else - local _ = _599_0 + local _ = _605_0 modexpr = compiler.compile1(ast[2], scope, parent, {nval = 1})[1] end end @@ -2221,13 +2251,13 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct utils.root.options["module-name"] = mod _ = nil local res = nil - local function _604_() - local _603_0 = search_module(mod) - if (nil ~= _603_0) then - local fennel_path = _603_0 + local function _610_() + local _609_0 = search_module(mod) + if (nil ~= _609_0) then + local fennel_path = _609_0 return include_path(ast, opts, fennel_path, mod, true) else - local _0 = _603_0 + local _0 = _609_0 local lua_path = search_module(mod, package.path) if lua_path then return include_path(ast, opts, lua_path, mod, false) @@ -2238,7 +2268,7 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct end end end - res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and opts.fallback(modexpr, true)) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _604_()) + res = ((utils["member?"](mod, (utils.root.options.skipInclude or {})) and opts.fallback(modexpr, true)) or include_circular_fallback(mod, modexpr, opts.fallback, ast) or utils.root.scope.includes[mod] or _610_()) utils.root.options["module-name"] = oldmod return res end @@ -2258,9 +2288,9 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return add_macros(macro_tbl, ast, scope) end doc_special("macros", {"{:macro-name-1 (fn [...] ...) ... :macro-name-N macro-body-N}"}, "Define all functions in the given table as macros local to the current scope.") - SPECIALS["tail!"] = function(ast, scope, _parent, _608_0) - local _609_ = _608_0 - local tail = _609_["tail"] + SPECIALS["tail!"] = function(ast, scope, _parent, _614_0) + local _615_ = _614_0 + local tail = _615_["tail"] compiler.assert((#ast == 2), "Expected one argument", ast) compiler.assert(utils["list?"](ast[2]), "Expected a call as argument", ast) compiler.assert(tail, "Must be in tail position", ast) @@ -2279,23 +2309,23 @@ package.preload["fennel.specials"] = package.preload["fennel.specials"] or funct return compiler.assert(false, "tried to use unquote outside quote", ast) end doc_special("unquote", {"..."}, "Evaluate the argument even if it's in a quoted form.") - return {["current-global-names"] = current_global_names, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} + return {["current-global-names"] = current_global_names, ["get-function-metadata"] = get_function_metadata, ["load-code"] = load_code, ["macro-loaded"] = macro_loaded, ["macro-searchers"] = macro_searchers, ["make-compiler-env"] = make_compiler_env, ["make-searcher"] = make_searcher, ["search-module"] = search_module, ["wrap-env"] = wrap_env, doc = doc_2a} end package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or function(...) local utils = require("fennel.utils") local parser = require("fennel.parser") local friend = require("fennel.friend") local unpack = (table.unpack or _G.unpack) - local scopes = {} + local scopes = {compiler = nil, global = nil, macro = nil} local function make_scope(_3fparent) local parent = (_3fparent or scopes.global) - local _261_ + local _264_ if parent then - _261_ = ((parent.depth or 0) + 1) + _264_ = ((parent.depth or 0) + 1) else - _261_ = 0 + _264_ = 0 end - return {["gensym-base"] = setmetatable({}, {__index = (parent and parent["gensym-base"])}), autogensyms = setmetatable({}, {__index = (parent and parent.autogensyms)}), depth = _261_, gensyms = setmetatable({}, {__index = (parent and parent.gensyms)}), hashfn = (parent and parent.hashfn), includes = setmetatable({}, {__index = (parent and parent.includes)}), macros = setmetatable({}, {__index = (parent and parent.macros)}), manglings = setmetatable({}, {__index = (parent and parent.manglings)}), parent = parent, refedglobals = {}, specials = setmetatable({}, {__index = (parent and parent.specials)}), symmeta = setmetatable({}, {__index = (parent and parent.symmeta)}), unmanglings = setmetatable({}, {__index = (parent and parent.unmanglings)}), vararg = (parent and parent.vararg)} + return {["gensym-base"] = setmetatable({}, {__index = (parent and parent["gensym-base"])}), autogensyms = setmetatable({}, {__index = (parent and parent.autogensyms)}), depth = _264_, gensyms = setmetatable({}, {__index = (parent and parent.gensyms)}), hashfn = (parent and parent.hashfn), includes = setmetatable({}, {__index = (parent and parent.includes)}), macros = setmetatable({}, {__index = (parent and parent.macros)}), manglings = setmetatable({}, {__index = (parent and parent.manglings)}), parent = parent, refedglobals = {}, specials = setmetatable({}, {__index = (parent and parent.specials)}), symmeta = setmetatable({}, {__index = (parent and parent.symmeta)}), unmanglings = setmetatable({}, {__index = (parent and parent.unmanglings)}), vararg = (parent and parent.vararg)} end local function assert_msg(ast, msg) local ast_tbl = nil @@ -2309,14 +2339,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local line = ((m and m.line) or ast_tbl.line or "?") local col = ((m and m.col) or ast_tbl.col or "?") local target = tostring((utils["sym?"](ast_tbl[1]) or ast_tbl[1] or "()")) - return string.format("%s:%s:%s Compile error in '%s': %s", filename, line, col, target, msg) + return string.format("%s:%s:%s: Compile error in '%s': %s", filename, line, col, target, msg) end local function assert_compile(condition, msg, ast, _3ffallback_ast) if not condition then - local _264_ = (utils.root.options or {}) - local error_pinpoint = _264_["error-pinpoint"] - local source = _264_["source"] - local unfriendly = _264_["unfriendly"] + local _267_ = (utils.root.options or {}) + local error_pinpoint = _267_["error-pinpoint"] + local source = _267_["source"] + local unfriendly = _267_["unfriendly"] local ast0 = nil if next(utils["ast-source"](ast)) then ast0 = ast @@ -2340,33 +2370,33 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct scopes.macro = scopes.global local serialize_subst = {["\11"] = "\\v", ["\12"] = "\\f", ["\7"] = "\\a", ["\8"] = "\\b", ["\9"] = "\\t", ["\n"] = "n"} local function serialize_string(str) - local function _269_(_241) + local function _272_(_241) return ("\\" .. _241:byte()) end - return string.gsub(string.gsub(string.format("%q", str), ".", serialize_subst), "[\128-\255]", _269_) + return string.gsub(string.gsub(string.format("%q", str), ".", serialize_subst), "[\128-\255]", _272_) end local function global_mangling(str) if utils["valid-lua-identifier?"](str) then return str else - local function _270_(_241) + local function _273_(_241) return string.format("_%02x", _241:byte()) end - return ("__fnl_global__" .. str:gsub("[^%w]", _270_)) + return ("__fnl_global__" .. str:gsub("[^%w]", _273_)) end end local function global_unmangling(identifier) - local _272_0 = string.match(identifier, "^__fnl_global__(.*)$") - if (nil ~= _272_0) then - local rest = _272_0 - local _273_0 = nil - local function _274_(_241) + local _275_0 = string.match(identifier, "^__fnl_global__(.*)$") + if (nil ~= _275_0) then + local rest = _275_0 + local _276_0 = nil + local function _277_(_241) return string.char(tonumber(_241:sub(2), 16)) end - _273_0 = string.gsub(rest, "_[%da-f][%da-f]", _274_) - return _273_0 + _276_0 = string.gsub(rest, "_[%da-f][%da-f]", _277_) + return _276_0 else - local _ = _272_0 + local _ = _275_0 return identifier end end @@ -2390,10 +2420,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct raw = str end local mangling = nil - local function _278_(_241) + local function _281_(_241) return string.format("_%02x", _241:byte()) end - mangling = string.gsub(string.gsub(raw, "-", "_"), "[^%w_]", _278_) + mangling = string.gsub(string.gsub(raw, "-", "_"), "[^%w_]", _281_) local unique = unique_mangling(mangling, mangling, scope, 0) scope.unmanglings[unique] = (scope["gensym-base"][str] or str) do @@ -2448,31 +2478,31 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return table.concat(parts, ".") end local function autogensym(base, scope) - local _282_0 = utils["multi-sym?"](base) - if (nil ~= _282_0) then - local parts = _282_0 + local _285_0 = utils["multi-sym?"](base) + if (nil ~= _285_0) then + local parts = _285_0 return combine_auto_gensym(parts, autogensym(parts[1], scope)) else - local _ = _282_0 - local function _283_() + local _ = _285_0 + local function _286_() local mangling = gensym(scope, base:sub(1, -2), "auto") scope.autogensyms[base] = mangling return mangling end - return (scope.autogensyms[base] or _283_()) + return (scope.autogensyms[base] or _286_()) end end local function check_binding_valid(symbol, scope, ast, _3fopts) local name = tostring(symbol) local macro_3f = nil do - local _285_0 = _3fopts - if (nil ~= _285_0) then - _285_0 = _285_0["macro?"] + local _288_0 = _3fopts + if (nil ~= _288_0) then + _288_0 = _288_0["macro?"] end - macro_3f = _285_0 + macro_3f = _288_0 end - assert_compile(not name:find("&"), "invalid character: &", symbol) + assert_compile(("&" ~= name:match("[&.:]")), "invalid character: &", symbol) assert_compile(not name:find("^%."), "invalid character: .", symbol) assert_compile(not (scope.specials[name] or (not macro_3f and scope.macros[name])), ("local %s was overshadowed by a special form or macro"):format(name), ast) return assert_compile(not utils["quoted?"](symbol), string.format("macro tried to bind %s without gensym", name), symbol) @@ -2568,22 +2598,22 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function flatten_chunk(file_sourcemap, chunk, tab, depth) if chunk.leaf then - local _297_ = utils["ast-source"](chunk.ast) - local filename = _297_["filename"] - local line = _297_["line"] + local _300_ = utils["ast-source"](chunk.ast) + local filename = _300_["filename"] + local line = _300_["line"] table.insert(file_sourcemap, {filename, line}) return chunk.leaf else local tab0 = nil do - local _298_0 = tab - if (_298_0 == true) then + local _301_0 = tab + if (_301_0 == true) then tab0 = " " - elseif (_298_0 == false) then + elseif (_301_0 == false) then tab0 = "" - elseif (_298_0 == tab) then + elseif (_301_0 == tab) then tab0 = tab - elseif (_298_0 == nil) then + elseif (_301_0 == nil) then tab0 = "" else tab0 = nil @@ -2629,7 +2659,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function make_metadata() - local function _306_(self, tgt, _3fkey) + local function _309_(self, tgt, _3fkey) if self[tgt] then if (nil ~= _3fkey) then return self[tgt][_3fkey] @@ -2638,12 +2668,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end end - local function _309_(self, tgt, key, value) + local function _312_(self, tgt, key, value) self[tgt] = (self[tgt] or {}) self[tgt][key] = value return tgt end - local function _310_(self, tgt, ...) + local function _313_(self, tgt, ...) local kv_len = select("#", ...) local kvs = {...} if ((kv_len % 2) ~= 0) then @@ -2655,7 +2685,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end return tgt end - return setmetatable({}, {__index = {get = _306_, set = _309_, setall = _310_}, __mode = "k"}) + return setmetatable({}, {__index = {get = _309_, set = _312_, setall = _313_}, __mode = "k"}) end local function exprs1(exprs) return table.concat(utils.map(exprs, tostring), ", ") @@ -2701,14 +2731,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end if opts.target then local result = exprs1(exprs) - local function _318_() + local function _321_() if (result == "") then return "nil" else return result end end - emit(parent, string.format("%s = %s", opts.target, _318_()), ast) + emit(parent, string.format("%s = %s", opts.target, _321_()), ast) end if (opts.tail or opts.target) then return {returned = true} @@ -2720,16 +2750,16 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function find_macro(ast, scope) local macro_2a = nil do - local _321_0 = utils["sym?"](ast[1]) - if (_321_0 ~= nil) then - local _322_0 = tostring(_321_0) - if (_322_0 ~= nil) then - macro_2a = scope.macros[_322_0] + local _324_0 = utils["sym?"](ast[1]) + if (_324_0 ~= nil) then + local _325_0 = tostring(_324_0) + if (_325_0 ~= nil) then + macro_2a = scope.macros[_325_0] else - macro_2a = _322_0 + macro_2a = _325_0 end else - macro_2a = _321_0 + macro_2a = _324_0 end end local multi_sym_parts = utils["multi-sym?"](ast[1]) @@ -2741,12 +2771,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return macro_2a end end - local function propagate_trace_info(_326_0, _index, node) - local _327_ = _326_0 - local byteend = _327_["byteend"] - local bytestart = _327_["bytestart"] - local filename = _327_["filename"] - local line = _327_["line"] + local function propagate_trace_info(_329_0, _index, node) + local _330_ = _329_0 + local byteend = _330_["byteend"] + local bytestart = _330_["bytestart"] + local filename = _330_["filename"] + local line = _330_["line"] do local src = utils["ast-source"](node) if (("table" == type(node)) and (filename ~= src.filename)) then @@ -2759,8 +2789,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function quote_literal_nils(index, node, parent) if (parent and utils["list?"](parent)) then for i = 1, utils.maxn(parent) do - local _329_0 = parent[i] - if (_329_0 == nil) then + local _332_0 = parent[i] + if (_332_0 == nil) then parent[i] = utils.sym("nil") end end @@ -2768,10 +2798,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return index, node, parent end local function comp(f, g) - local function _332_(...) + local function _335_(...) return f(g(...)) end - return _332_ + return _335_ end local function built_in_3f(m) local found_3f = false @@ -2782,45 +2812,46 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return found_3f end local function macroexpand_2a(ast, scope, _3fonce) - local _333_0 = nil + local _336_0 = nil if utils["list?"](ast) then - _333_0 = find_macro(ast, scope) + _336_0 = find_macro(ast, scope) else - _333_0 = nil + _336_0 = nil end - if (_333_0 == false) then + if (_336_0 == false) then return ast - elseif (nil ~= _333_0) then - local macro_2a = _333_0 + elseif (nil ~= _336_0) then + local macro_2a = _336_0 local old_scope = scopes.macro local _ = nil scopes.macro = scope _ = nil local ok, transformed = nil, nil - local function _335_() + local function _338_() return macro_2a(unpack(ast, 2)) end - local function _336_() + local function _339_() if built_in_3f(macro_2a) then return tostring else return debug.traceback end end - ok, transformed = xpcall(_335_, _336_()) - local function _337_(...) + ok, transformed = xpcall(_338_, _339_()) + local function _340_(...) return propagate_trace_info(ast, ...) end - utils["walk-tree"](transformed, comp(_337_, quote_literal_nils)) + utils["walk-tree"](transformed, comp(_340_, quote_literal_nils)) scopes.macro = old_scope assert_compile(ok, transformed, ast) + utils.hook("macroexpand", ast, transformed, scope) if (_3fonce or not transformed) then return transformed else return macroexpand_2a(transformed, scope) end else - local _ = _333_0 + local _ = _336_0 return ast end end @@ -2852,13 +2883,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct assert_compile((utils["sym?"](ast[1]) or utils["list?"](ast[1]) or ("string" == type(ast[1]))), ("cannot call literal value " .. tostring(ast[1])), ast) for i = 2, len do local subexprs = nil - local _343_ + local _346_ if (i ~= len) then - _343_ = 1 + _346_ = 1 else - _343_ = nil + _346_ = nil end - subexprs = compile1(ast[i], scope, parent, {nval = _343_}) + subexprs = compile1(ast[i], scope, parent, {nval = _346_}) table.insert(fargs, subexprs[1]) if (i == len) then for j = 2, #subexprs do @@ -2896,13 +2927,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function compile_varg(ast, scope, parent, opts) - local _348_ + local _351_ if scope.hashfn then - _348_ = "use $... in hashfn" + _351_ = "use $... in hashfn" else - _348_ = "unexpected vararg" + _351_ = "unexpected vararg" end - assert_compile(scope.vararg, _348_, ast) + assert_compile(scope.vararg, _351_, ast) return handle_compile_opts({utils.expr("...", "varg")}, parent, opts, ast) end local function compile_sym(ast, scope, parent, opts) @@ -2917,20 +2948,20 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return handle_compile_opts({e}, parent, opts, ast) end local function serialize_number(n) - local _351_0 = string.gsub(tostring(n), ",", ".") - return _351_0 + local _354_0 = string.gsub(tostring(n), ",", ".") + return _354_0 end local function compile_scalar(ast, _scope, parent, opts) local serialize = nil do - local _352_0 = type(ast) - if (_352_0 == "nil") then + local _355_0 = type(ast) + if (_355_0 == "nil") then serialize = tostring - elseif (_352_0 == "boolean") then + elseif (_355_0 == "boolean") then serialize = tostring - elseif (_352_0 == "string") then + elseif (_355_0 == "string") then serialize = serialize_string - elseif (_352_0 == "number") then + elseif (_355_0 == "number") then serialize = serialize_number else serialize = nil @@ -2943,8 +2974,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if ((type(k) == "string") and utils["valid-lua-identifier?"](k)) then return k else - local _354_ = compile1(k, scope, parent, {nval = 1}) - local compiled = _354_[1] + local _357_ = compile1(k, scope, parent, {nval = 1}) + local compiled = _357_[1] return ("[" .. tostring(compiled) .. "]") end end @@ -2973,8 +3004,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct for k in utils.stablepairs(ast) do local val_19_ = nil if not keys[k] then - local _357_ = compile1(ast[k], scope, parent, {nval = 1}) - local v = _357_[1] + local _360_ = compile1(ast[k], scope, parent, {nval = 1}) + local v = _360_[1] val_19_ = string.format("%s = %s", escape_key(k), tostring(v)) else val_19_ = nil @@ -3006,12 +3037,12 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function destructure(to, from, ast, scope, parent, opts) local opts0 = (opts or {}) - local _361_ = opts0 - local declaration = _361_["declaration"] - local forceglobal = _361_["forceglobal"] - local forceset = _361_["forceset"] - local isvar = _361_["isvar"] - local symtype = _361_["symtype"] + local _364_ = opts0 + local declaration = _364_["declaration"] + local forceglobal = _364_["forceglobal"] + local forceset = _364_["forceset"] + local isvar = _364_["isvar"] + local symtype = _364_["symtype"] local symtype0 = ("_" .. (symtype or "dst")) local setter = nil if declaration then @@ -3027,8 +3058,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return declare_local(symbol, nil, scope, symbol, new_manglings) else local parts = (utils["multi-sym?"](raw) or {raw}) - local _363_ = parts - local first = _363_[1] + local _366_ = parts + local first = _366_[1] local meta = scope.symmeta[first] assert_compile(not raw:find(":"), "cannot set method sym", symbol) if ((#parts == 1) and not forceset) then @@ -3049,14 +3080,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end local function compile_top_target(lvalues) local inits = nil - local function _368_(_241) + local function _371_(_241) if scope.manglings[_241] then return _241 else return "nil" end end - inits = utils.map(lvalues, _368_) + inits = utils.map(lvalues, _371_) local init = table.concat(inits, ", ") local lvalue = table.concat(lvalues, ", ") local plast = parent[#parent] @@ -3094,7 +3125,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local unpack_fn = "function (t, k, e)\n local mt = getmetatable(t)\n if 'table' == type(mt) and mt.__fennelrest then\n return mt.__fennelrest(t, k)\n elseif e then\n local rest = {}\n for k, v in pairs(t) do\n if not e[k] then rest[k] = v end\n end\n return rest\n else\n return {(table.unpack or unpack)(t, k)}\n end\n end" local function destructure_kv_rest(s, v, left, excluded_keys, destructure1) local exclude_str = nil - local _375_ + local _378_ do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -3105,9 +3136,9 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct tbl_17_[i_18_] = val_19_ end end - _375_ = tbl_17_ + _378_ = tbl_17_ end - exclude_str = table.concat(_375_, ", ") + exclude_str = table.concat(_378_, ", ") local subexpr = utils.expr(string.format(string.gsub(("(" .. unpack_fn .. ")(%s, %s, {%s})"), "\n%s*", " "), s, tostring(v), exclude_str), "expression") return destructure1(v, {subexpr}, left) end @@ -3122,16 +3153,16 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local s = gensym(scope, symtype0) local right = nil do - local _377_0 = nil + local _380_0 = nil if top_3f then - _377_0 = exprs1(compile1(from, scope, parent)) + _380_0 = exprs1(compile1(from, scope, parent)) else - _377_0 = exprs1(rightexprs) + _380_0 = exprs1(rightexprs) end - if (_377_0 == "") then + if (_380_0 == "") then right = "nil" - elseif (nil ~= _377_0) then - local right0 = _377_0 + elseif (nil ~= _380_0) then + local right0 = _380_0 right = right0 else right = nil @@ -3216,7 +3247,7 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local function require_include(ast, scope, parent, opts) opts.fallback = function(e, no_warn) if (not no_warn and ("literal" == e.type)) then - utils.warn(("include module not found, falling back to require: %s"):format(tostring(e))) + utils.warn(("include module not found, falling back to require: %s"):format(tostring(e)), ast) end return utils.expr(string.format("require(%s)", tostring(e)), "statement") end @@ -3239,8 +3270,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct if opts.assertAsRepl then scope.macros.assert = scope.macros["assert-repl"] end - local _392_ = utils.root - _392_["set-reset"](_392_) + local _395_ = utils.root + _395_["set-reset"](_395_) utils.root.chunk, utils.root.scope, utils.root.options = chunk, scope, opts for i = 1, #asts do local exprs = compile1(asts[i], scope, chunk, {nval = (((i < #asts) and 0) or nil), tail = (i == #asts)}) @@ -3253,7 +3284,8 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct utils.root.reset() return flatten(chunk, opts) end - local function compile_stream(stream, opts) + local function compile_stream(stream, _3fopts) + local opts = (_3fopts or {}) local asts = nil do local tbl_17_ = {} @@ -3270,16 +3302,16 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return compile_asts(asts, opts) end local function compile_string(str, _3fopts) - return compile_stream(parser["string-stream"](str, (_3fopts or {})), (_3fopts or {})) + return compile_stream(parser["string-stream"](str, _3fopts), _3fopts) end local function compile(ast, _3fopts) return compile_asts({ast}, _3fopts) end local function traceback_frame(info) if ((info.what == "C") and info.name) then - return string.format(" [C]: in function '%s'", info.name) + return string.format("\9[C]: in function '%s'", info.name) elseif (info.what == "C") then - return " [C]: in ?" + return "\9[C]: in ?" else local remap = sourcemap[info.source] if (remap and remap[info.currentline]) then @@ -3291,18 +3323,18 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct info.currentline = (remap[info.currentline][2] or -1) end if (info.what == "Lua") then - local function _397_() + local function _400_() if info.name then return ("'" .. info.name .. "'") else return "?" end end - return string.format(" %s:%d: in function %s", info.short_src, info.currentline, _397_()) + return string.format("\9%s:%d: in function %s", info.short_src, info.currentline, _400_()) elseif (info.short_src == "(tail call)") then return " (tail call)" else - return string.format(" %s:%d: in main chunk", info.short_src, info.currentline) + return string.format("\9%s:%d: in main chunk", info.short_src, info.currentline) end end end @@ -3322,11 +3354,11 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct local done_3f, level = false, (_3fstart or 2) while not done_3f do do - local _401_0 = debug.getinfo(level, "Sln") - if (_401_0 == nil) then + local _404_0 = debug.getinfo(level, "Sln") + if (_404_0 == nil) then done_3f = true - elseif (nil ~= _401_0) then - local info = _401_0 + elseif (nil ~= _404_0) then + local info = _404_0 table.insert(lines, traceback_frame(info)) end end @@ -3336,14 +3368,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct end end local function entry_transform(fk, fv) - local function _404_(k, v) + local function _407_(k, v) if (type(k) == "number") then return k, fv(v) else return fk(k), fv(v) end end - return _404_ + return _407_ end local function mixed_concat(t, joiner) local seen = {} @@ -3388,10 +3420,10 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct return res[1] elseif utils["list?"](form) then local mapped = nil - local function _409_() + local function _412_() return nil end - mapped = utils.kvmap(form, entry_transform(_409_, q)) + mapped = utils.kvmap(form, entry_transform(_412_, q)) local filename = nil if form.filename then filename = string.format("%q", form.filename) @@ -3409,13 +3441,13 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else filename = "nil" end - local _412_ + local _415_ if source then - _412_ = source.line + _415_ = source.line else - _412_ = "nil" + _415_ = "nil" end - return string.format("setmetatable({%s}, {filename=%s, line=%s, sequence=%s})", mixed_concat(mapped, ", "), filename, _412_, "(getmetatable(sequence()))['sequence']") + return string.format("setmetatable({%s}, {filename=%s, line=%s, sequence=%s})", mixed_concat(mapped, ", "), filename, _415_, "(getmetatable(sequence()))['sequence']") elseif (type(form) == "table") then local mapped = utils.kvmap(form, entry_transform(q, q)) local source = getmetatable(form) @@ -3425,14 +3457,14 @@ package.preload["fennel.compiler"] = package.preload["fennel.compiler"] or funct else filename = "nil" end - local function _415_() + local function _418_() if source then return source.line else return "nil" end end - return string.format("setmetatable({%s}, {filename=%s, line=%s})", mixed_concat(mapped, ", "), filename, _415_()) + return string.format("setmetatable({%s}, {filename=%s, line=%s})", mixed_concat(mapped, ", "), filename, _418_()) elseif (type(form) == "string") then return serialize_string(form) else @@ -3485,13 +3517,13 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( return error(..., 0) end end - local function _184_() + local function _187_() for _ = 2, line do f:read() end return f:read() end - return close_handlers_10_(_G.xpcall(_184_, (package.loaded.fennel or debug).traceback)) + return close_handlers_10_(_G.xpcall(_187_, (package.loaded.fennel or debug).traceback)) end end local function sub(str, start, _end) @@ -3507,8 +3539,8 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( if ((opts and (false == opts["error-pinpoint"])) or (os and os.getenv and os.getenv("NO_COLOR"))) then return codeline else - local _187_ = (opts or {}) - local error_pinpoint = _187_["error-pinpoint"] + local _190_ = (opts or {}) + local error_pinpoint = _190_["error-pinpoint"] local endcol = (_3fendcol or col) local eol = nil if utf8_ok_3f then @@ -3516,19 +3548,19 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( else eol = string.len(codeline) end - local _189_ = (error_pinpoint or {"\27[7m", "\27[0m"}) - local open = _189_[1] - local close = _189_[2] + local _192_ = (error_pinpoint or {"\27[7m", "\27[0m"}) + local open = _192_[1] + local close = _192_[2] return (sub(codeline, 1, col) .. open .. sub(codeline, (col + 1), (endcol + 1)) .. close .. sub(codeline, (endcol + 2), eol)) end end - local function friendly_msg(msg, _191_0, source, opts) - local _192_ = _191_0 - local col = _192_["col"] - local endcol = _192_["endcol"] - local endline = _192_["endline"] - local filename = _192_["filename"] - local line = _192_["line"] + local function friendly_msg(msg, _194_0, source, opts) + local _195_ = _194_0 + local col = _195_["col"] + local endcol = _195_["endcol"] + local endline = _195_["endline"] + local filename = _195_["filename"] + local line = _195_["line"] local ok, codeline = pcall(read_line, filename, line, source) local endcol0 = nil if (ok and codeline and (line ~= endline)) then @@ -3551,16 +3583,16 @@ package.preload["fennel.friend"] = package.preload["fennel.friend"] or function( end local function assert_compile(condition, msg, ast, source, opts) if not condition then - local _196_ = utils["ast-source"](ast) - local col = _196_["col"] - local filename = _196_["filename"] - local line = _196_["line"] - error(friendly_msg(("%s:%s:%s Compile error: %s"):format((filename or "unknown"), (line or "?"), (col or "?"), msg), utils["ast-source"](ast), source, opts), 0) + local _199_ = utils["ast-source"](ast) + local col = _199_["col"] + local filename = _199_["filename"] + local line = _199_["line"] + error(friendly_msg(("%s:%s:%s: Compile error: %s"):format((filename or "unknown"), (line or "?"), (col or "?"), msg), utils["ast-source"](ast), source, opts), 0) end return condition end local function parse_error(msg, filename, line, col, source, opts) - return error(friendly_msg(("%s:%s:%s Parse error: %s"):format(filename, line, col, msg), {col = col, filename = filename, line = line}, source, opts), 0) + return error(friendly_msg(("%s:%s:%s: Parse error: %s"):format(filename, line, col, msg), {col = col, filename = filename, line = line}, source, opts), 0) end return {["assert-compile"] = assert_compile, ["parse-error"] = parse_error} end @@ -3570,36 +3602,36 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local unpack = (table.unpack or _G.unpack) local function granulate(getchunk) local c, index, done_3f = "", 1, false - local function _198_(parser_state) + local function _201_(parser_state) if not done_3f then if (index <= #c) then local b = c:byte(index) index = (index + 1) return b else - local _199_0 = getchunk(parser_state) - local function _200_() - local char = _199_0 + local _202_0 = getchunk(parser_state) + local function _203_() + local char = _202_0 return (char ~= "") end - if ((nil ~= _199_0) and _200_()) then - local char = _199_0 + if ((nil ~= _202_0) and _203_()) then + local char = _202_0 c = char index = 2 return c:byte() else - local _ = _199_0 + local _ = _202_0 done_3f = true return nil end end end end - local function _204_() + local function _207_() c = "" return nil end - return _198_, _204_ + return _201_, _207_ end local function string_stream(str, _3foptions) local str0 = str:gsub("^#!", ";;") @@ -3607,12 +3639,12 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( _3foptions.source = str0 end local index = 1 - local function _206_() + local function _209_() local r = str0:byte(index) index = (index + 1) return r end - return _206_ + return _209_ end local delims = {[123] = 125, [125] = true, [40] = 41, [41] = true, [91] = 93, [93] = true} local function sym_char_3f(b) @@ -3628,12 +3660,12 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( local function char_starter_3f(b) return (((1 < b) and (b < 127)) or ((192 < b) and (b < 247))) end - local function parser_fn(getbyte, filename, _208_0) - local _209_ = _208_0 - local options = _209_ - local comments = _209_["comments"] - local source = _209_["source"] - local unfriendly = _209_["unfriendly"] + local function parser_fn(getbyte, filename, _211_0) + local _212_ = _211_0 + local options = _212_ + local comments = _212_["comments"] + local source = _212_["source"] + local unfriendly = _212_["unfriendly"] local stack = {} local line, byteindex, col, prev_col, lastb = 1, 0, 0, 0, nil local function ungetb(ub) @@ -3666,21 +3698,21 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return r end local function whitespace_3f(b) - local function _217_() - local _216_0 = options.whitespace - if (nil ~= _216_0) then - _216_0 = _216_0[b] + local function _220_() + local _219_0 = options.whitespace + if (nil ~= _219_0) then + _219_0 = _219_0[b] end - return _216_0 + return _219_0 end - return ((b == 32) or ((9 <= b) and (b <= 13)) or _217_()) + return ((b == 32) or ((9 <= b) and (b <= 13)) or _220_()) end local function parse_error(msg, _3fcol_adjust) local col0 = (col + (_3fcol_adjust or -1)) if (nil == utils["hook-opts"]("parse-error", options, msg, filename, (line or "?"), col0, source, utils.root.reset)) then utils.root.reset() if unfriendly then - return error(string.format("%s:%s:%s Parse error: %s", filename, (line or "?"), col0, msg), 0) + return error(string.format("%s:%s:%s: Parse error: %s", filename, (line or "?"), col0, msg), 0) else return friend["parse-error"](msg, filename, (line or "?"), col0, source, options) end @@ -3693,38 +3725,38 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return nil end local function dispatch(v) - local _221_0 = stack[#stack] - if (_221_0 == nil) then + local _224_0 = stack[#stack] + if (_224_0 == nil) then retval, done_3f, whitespace_since_dispatch = v, true, false return nil - elseif ((_G.type(_221_0) == "table") and (nil ~= _221_0.prefix)) then - local prefix = _221_0.prefix + elseif ((_G.type(_224_0) == "table") and (nil ~= _224_0.prefix)) then + local prefix = _224_0.prefix local source0 = nil do - local _222_0 = table.remove(stack) - set_source_fields(_222_0) - source0 = _222_0 + local _225_0 = table.remove(stack) + set_source_fields(_225_0) + source0 = _225_0 end local list = utils.list(utils.sym(prefix, source0), v) for k, v0 in pairs(source0) do list[k] = v0 end return dispatch(list) - elseif (nil ~= _221_0) then - local top = _221_0 + elseif (nil ~= _224_0) then + local top = _224_0 whitespace_since_dispatch = false return table.insert(top, v) end end local function badend() local accum = utils.map(stack, "closer") - local _224_ + local _227_ if (#stack == 1) then - _224_ = "" + _227_ = "" else - _224_ = "s" + _227_ = "s" end - return parse_error(string.format("expected closing delimiter%s %s", _224_, string.char(unpack(accum)))) + return parse_error(string.format("expected closing delimiter%s %s", _227_, string.char(unpack(accum)))) end local function skip_whitespace(b, close_table) if (b and whitespace_3f(b)) then @@ -3742,11 +3774,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end local function parse_comment(b, contents) if (b and (10 ~= b)) then - local function _227_() + local function _230_() table.insert(contents, string.char(b)) return contents end - return parse_comment(getb(), _227_()) + return parse_comment(getb(), _230_()) elseif comments then ungetb(10) return dispatch(utils.comment(table.concat(contents), {filename = filename, line = line})) @@ -3772,12 +3804,12 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( return dispatch(setmetatable(tbl, mt)) end local function add_comment_at(comments0, index, node) - local _231_0 = comments0[index] - if (nil ~= _231_0) then - local existing = _231_0 + local _234_0 = comments0[index] + if (nil ~= _234_0) then + local existing = _234_0 return table.insert(existing, node) else - local _ = _231_0 + local _ = _234_0 comments0[index] = {node} return nil end @@ -3856,16 +3888,16 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end local state0 = nil do - local _242_0 = {state, b} - if ((_G.type(_242_0) == "table") and (_242_0[1] == "base") and (_242_0[2] == 92)) then + local _245_0 = {state, b} + if ((_G.type(_245_0) == "table") and (_245_0[1] == "base") and (_245_0[2] == 92)) then state0 = "backslash" - elseif ((_G.type(_242_0) == "table") and (_242_0[1] == "base") and (_242_0[2] == 34)) then + elseif ((_G.type(_245_0) == "table") and (_245_0[1] == "base") and (_245_0[2] == 34)) then state0 = "done" - elseif ((_G.type(_242_0) == "table") and (_242_0[1] == "backslash") and (_242_0[2] == 10)) then + elseif ((_G.type(_245_0) == "table") and (_245_0[1] == "backslash") and (_245_0[2] == 10)) then table.remove(chars, (#chars - 1)) state0 = "base" else - local _ = _242_0 + local _ = _245_0 state0 = "base" end end @@ -3887,11 +3919,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( table.remove(stack) local raw = table.concat(chars) local formatted = raw:gsub("[\7-\13]", escape_char) - local _246_0 = (rawget(_G, "loadstring") or load)(("return " .. formatted)) - if (nil ~= _246_0) then - local load_fn = _246_0 + local _249_0 = (rawget(_G, "loadstring") or load)(("return " .. formatted)) + if (nil ~= _249_0) then + local load_fn = _249_0 return dispatch(load_fn()) - elseif (_246_0 == nil) then + elseif (_249_0 == nil) then return parse_error(("Invalid string: " .. raw)) end end @@ -3924,13 +3956,13 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( dispatch((tonumber(number_with_stripped_underscores) or parse_error(("could not read number \"" .. rawstr .. "\"")))) return true else - local _252_0 = tonumber(number_with_stripped_underscores) - if (nil ~= _252_0) then - local x = _252_0 + local _255_0 = tonumber(number_with_stripped_underscores) + if (nil ~= _255_0) then + local x = _255_0 dispatch(x) return true else - local _ = _252_0 + local _ = _255_0 return false end end @@ -3941,8 +3973,6 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end if (rawstr:match("^~") and (rawstr ~= "~=")) then parse_error("invalid character: ~") - elseif rawstr:match("%.[0-9]") then - parse_error(("can't start multisym segment with a digit: " .. rawstr), col_adjust("%.[0-9]")) elseif (rawstr:match("[%.:][%.:]") and (rawstr ~= "..") and (rawstr ~= "$...")) then parse_error(("malformed multisym: " .. rawstr), col_adjust("[%.:][%.:]")) elseif ((rawstr ~= ":") and rawstr:match(":$")) then @@ -3995,11 +4025,11 @@ package.preload["fennel.parser"] = package.preload["fennel.parser"] or function( end return parse_loop(skip_whitespace(getb(), close_table)) end - local function _259_() - stack, line, byteindex, col, lastb = {}, 1, 0, 0, nil + local function _262_() + stack, line, byteindex, col, lastb = {}, 1, 0, 0, ((lastb ~= 10) and lastb) return nil end - return parse_stream, _259_ + return parse_stream, _262_ end local function parser(stream_or_string, _3ffilename, _3foptions) local filename = (_3ffilename or "unknown") @@ -4625,14 +4655,14 @@ package.preload["fennel.view"] = package.preload["fennel.view"] or function(...) end end pp = _93_ - local function view(x, _3foptions) + local function _view(x, _3foptions) return pp(x, make_options(x, _3foptions), 0) end - return view + return _view end package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(...) local view = require("fennel.view") - local version = "1.4.1-dev" + local version = "1.4.1" local function luajit_vm_3f() return ((nil ~= _G.jit) and (type(_G.jit) == "table") and (nil ~= _G.jit.on) and (nil ~= _G.jit.off) and (type(_G.jit.version_num) == "number")) end @@ -4667,39 +4697,34 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return ("Fennel " .. version .. " on " .. lua_vm_version()) end end - local function warn(message) - if (_G.io and _G.io.stderr) then - return (_G.io.stderr):write(("--WARNING: %s\n"):format(tostring(message))) - end - end local len = nil do - local _104_0, _105_0 = pcall(require, "utf8") - if ((_104_0 == true) and (nil ~= _105_0)) then - local utf8 = _105_0 + local _103_0, _104_0 = pcall(require, "utf8") + if ((_103_0 == true) and (nil ~= _104_0)) then + local utf8 = _104_0 len = utf8.len else - local _ = _104_0 + local _ = _103_0 len = string.len end end local kv_order = {boolean = 2, number = 1, string = 3, table = 4} local function kv_compare(a, b) - local _107_0, _108_0 = type(a), type(b) - if (((_107_0 == "number") and (_108_0 == "number")) or ((_107_0 == "string") and (_108_0 == "string"))) then + local _106_0, _107_0 = type(a), type(b) + if (((_106_0 == "number") and (_107_0 == "number")) or ((_106_0 == "string") and (_107_0 == "string"))) then return (a < b) else - local function _109_() - local a_t = _107_0 - local b_t = _108_0 + local function _108_() + local a_t = _106_0 + local b_t = _107_0 return (a_t ~= b_t) end - if (((nil ~= _107_0) and (nil ~= _108_0)) and _109_()) then - local a_t = _107_0 - local b_t = _108_0 + if (((nil ~= _106_0) and (nil ~= _107_0)) and _108_()) then + local a_t = _106_0 + local b_t = _107_0 return ((kv_order[a_t] or 5) < (kv_order[b_t] or 5)) else - local _ = _107_0 + local _ = _106_0 return (tostring(a) < tostring(b)) end end @@ -4731,20 +4756,20 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function stablepairs(t) local mt_keys = nil do - local _113_0 = getmetatable(t) - if (nil ~= _113_0) then - _113_0 = _113_0.keys + local _112_0 = getmetatable(t) + if (nil ~= _112_0) then + _112_0 = _112_0.keys end - mt_keys = _113_0 + mt_keys = _112_0 end local succ, prev, first_mt = nil, nil, nil - local function _115_(_241) + local function _114_(_241) return t[_241] end - succ, prev, first_mt = add_stable_keys({}, nil, (mt_keys or {}), _115_) + succ, prev, first_mt = add_stable_keys({}, nil, (mt_keys or {}), _114_) local pairs_keys = nil do - local _116_0 = nil + local _115_0 = nil do local tbl_17_ = {} local i_18_ = #tbl_17_ @@ -4755,10 +4780,10 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. tbl_17_[i_18_] = val_19_ end end - _116_0 = tbl_17_ + _115_0 = tbl_17_ end - table.sort(_116_0, kv_compare) - pairs_keys = _116_0 + table.sort(_115_0, kv_compare) + pairs_keys = _115_0 end local succ0, _, first_after_mt = add_stable_keys(succ, prev, pairs_keys) local first = nil @@ -4768,19 +4793,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. first = first_mt end local function stablenext(tbl, key) - local _119_0 = nil + local _118_0 = nil if (key == nil) then - _119_0 = first + _118_0 = first else - _119_0 = succ0[key] + _118_0 = succ0[key] end - if (nil ~= _119_0) then - local next_key = _119_0 - local _121_0 = tbl[next_key] - if (_121_0 ~= nil) then - return next_key, _121_0 + if (nil ~= _118_0) then + local next_key = _118_0 + local _120_0 = tbl[next_key] + if (_120_0 ~= nil) then + return next_key, _120_0 else - return _121_0 + return _120_0 end end end @@ -4791,25 +4816,25 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (0 == #path) then return _3ffallback else - local _124_0 = nil + local _123_0 = nil do local t = tbl for _, k in ipairs(path) do if (nil == t) then break end - local _125_0 = type(t) - if (_125_0 == "table") then + local _124_0 = type(t) + if (_124_0 == "table") then t = t[k] else t = nil end end - _124_0 = t + _123_0 = t end - if (nil ~= _124_0) then - local res = _124_0 + if (nil ~= _123_0) then + local res = _123_0 return res else - local _ = _124_0 + local _ = _123_0 return _3ffallback end end @@ -4820,15 +4845,15 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (type(f) == "function") then f0 = f else - local function _129_(_241) + local function _128_(_241) return _241[f] end - f0 = _129_ + f0 = _128_ end for _, x in ipairs(t) do - local _131_0 = f0(x) - if (nil ~= _131_0) then - local v = _131_0 + local _130_0 = f0(x) + if (nil ~= _130_0) then + local v = _130_0 table.insert(out, v) end end @@ -4840,19 +4865,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. if (type(f) == "function") then f0 = f else - local function _133_(_241) + local function _132_(_241) return _241[f] end - f0 = _133_ + f0 = _132_ end for k, x in stablepairs(t) do - local _135_0, _136_0 = f0(k, x) - if ((nil ~= _135_0) and (nil ~= _136_0)) then - local key = _135_0 - local value = _136_0 - out[key] = value - elseif (nil ~= _135_0) then + local _134_0, _135_0 = f0(k, x) + if ((nil ~= _134_0) and (nil ~= _135_0)) then + local key = _134_0 local value = _135_0 + out[key] = value + elseif (nil ~= _134_0) then + local value = _134_0 table.insert(out, value) end end @@ -4869,13 +4894,13 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return tbl_14_ end local function member_3f(x, tbl, _3fn) - local _139_0 = tbl[(_3fn or 1)] - if (_139_0 == x) then + local _138_0 = tbl[(_3fn or 1)] + if (_138_0 == x) then return true - elseif (_139_0 == nil) then + elseif (_138_0 == nil) then return nil else - local _ = _139_0 + local _ = _138_0 return member_3f(x, tbl, ((_3fn or 1) + 1)) end end @@ -4910,9 +4935,9 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. seen[next_state] = true return next_state, value else - local _142_0 = getmetatable(t) - if ((_G.type(_142_0) == "table") and true) then - local __index = _142_0.__index + local _141_0 = getmetatable(t) + if ((_G.type(_141_0) == "table") and true) then + local __index = _141_0.__index if ("table" == type(__index)) then t = __index return allpairs_next(t) @@ -4930,10 +4955,10 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local safe = {} local view0 = nil if _3fview then - local function _146_(_241) + local function _145_(_241) return _3fview(_241, _3foptions, _3findent) end - view0 = _146_ + view0 = _145_ else view0 = view end @@ -4954,19 +4979,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end local symbol_mt = {"SYMBOL", __eq = sym_3d, __fennelview = deref, __lt = sym_3c, __tostring = deref} local expr_mt = nil - local function _148_(x) + local function _147_(x) return tostring(deref(x)) end - expr_mt = {"EXPR", __tostring = _148_} + expr_mt = {"EXPR", __tostring = _147_} local list_mt = {"LIST", __fennelview = list__3estring, __tostring = list__3estring} local comment_mt = {"COMMENT", __eq = sym_3d, __fennelview = comment_view, __lt = sym_3c, __tostring = deref} local sequence_marker = {"SEQUENCE"} local varg_mt = {"VARARG", __fennelview = deref, __tostring = deref} local getenv = nil - local function _149_() + local function _148_() return nil end - getenv = ((os and os.getenv) or _149_) + getenv = ((os and os.getenv) or _148_) local function debug_on_3f(flag) local level = (getenv("FENNEL_DEBUG") or "") return ((level == "all") or level:find(flag)) @@ -4975,7 +5000,7 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return setmetatable({...}, list_mt) end local function sym(str, _3fsource) - local _150_ + local _149_ do local tbl_14_ = {str} for k, v in pairs((_3fsource or {})) do @@ -4989,13 +5014,13 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. tbl_14_[k_15_] = v_16_ end end - _150_ = tbl_14_ + _149_ = tbl_14_ end - return setmetatable(_150_, symbol_mt) + return setmetatable(_149_, symbol_mt) end nil_sym = sym("nil") local function sequence(...) - local function _153_(seq, view0, inspector, indent) + local function _152_(seq, view0, inspector, indent) local opts = nil do inspector["empty-as-sequence?"] = {after = inspector["empty-as-sequence?"], once = true} @@ -5004,19 +5029,19 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end return view0(seq, opts, indent) end - return setmetatable({...}, {__fennelview = _153_, sequence = sequence_marker}) + return setmetatable({...}, {__fennelview = _152_, sequence = sequence_marker}) end local function expr(strcode, etype) return setmetatable({strcode, type = etype}, expr_mt) end local function comment_2a(contents, _3fsource) - local _154_ = (_3fsource or {}) - local filename = _154_["filename"] - local line = _154_["line"] + local _153_ = (_3fsource or {}) + local filename = _153_["filename"] + local line = _153_["line"] return setmetatable({contents, filename = filename, line = line}, comment_mt) end local function varg(_3fsource) - local _155_ + local _154_ do local tbl_14_ = {"..."} for k, v in pairs((_3fsource or {})) do @@ -5030,9 +5055,9 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. tbl_14_[k_15_] = v_16_ end end - _155_ = tbl_14_ + _154_ = tbl_14_ end - return setmetatable(_155_, varg_mt) + return setmetatable(_154_, varg_mt) end local function expr_3f(x) return ((type(x) == "table") and (getmetatable(x) == expr_mt) and x) @@ -5070,7 +5095,11 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end end local function string_3f(x) - return (type(x) == "string") + if (type(x) == "string") then + return x + else + return false + end end local function multi_sym_3f(str) if sym_3f(str) then @@ -5103,15 +5132,6 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local t = type(x) return ((t == "string") or (t == "integer") or (t == "number") or (t == "boolean") or (sym_3f(x) and not multi_sym_3f(x))) end - local function ast_source(ast) - if (table_3f(ast) or sequence_3f(ast)) then - return (getmetatable(ast) or {}) - elseif ("table" == type(ast)) then - return ast - else - return {} - end - end local function walk_tree(root, f, _3fcustom_iterator) local function walk(iterfn, parent, idx, node) if f(idx, node, parent) then @@ -5136,27 +5156,53 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. return subopts end local root = nil - local function _166_() + local function _165_() end - root = {chunk = nil, options = nil, reset = _166_, scope = nil} - root["set-reset"] = function(_167_0) - local _168_ = _167_0 - local chunk = _168_["chunk"] - local options = _168_["options"] - local reset = _168_["reset"] - local scope = _168_["scope"] + root = {chunk = nil, options = nil, reset = _165_, scope = nil} + root["set-reset"] = function(_166_0) + local _167_ = _166_0 + local chunk = _167_["chunk"] + local options = _167_["options"] + local reset = _167_["reset"] + local scope = _167_["scope"] root.reset = function() root.chunk, root.scope, root.options, root.reset = chunk, scope, options, reset return nil end return root.reset end + local function ast_source(ast) + if (table_3f(ast) or sequence_3f(ast)) then + return (getmetatable(ast) or {}) + elseif ("table" == type(ast)) then + return ast + else + return {} + end + end + local function warn(msg, _3fast) + if (_G.io and _G.io.stderr) then + local loc = nil + do + local _169_0 = ast_source(_3fast) + if ((_G.type(_169_0) == "table") and (nil ~= _169_0.filename) and (nil ~= _169_0.line)) then + local filename = _169_0.filename + local line = _169_0.line + loc = (filename .. ":" .. line .. ": ") + else + local _ = _169_0 + loc = "" + end + end + return (_G.io.stderr):write(("--WARNING: %s%s\n"):format(loc, tostring(msg))) + end + end local warned = {} - local function check_plugin_version(_169_0) - local _170_ = _169_0 - local plugin = _170_ - local name = _170_["name"] - local versions = _170_["versions"] + local function check_plugin_version(_172_0) + local _173_ = _172_0 + local plugin = _173_ + local name = _173_["name"] + local versions = _173_["versions"] if (not member_3f(version:gsub("-dev", ""), (versions or {})) and not warned[plugin]) then warned[plugin] = true return warn(string.format("plugin %s does not support Fennel version %s", (name or "unknown"), version)) @@ -5164,29 +5210,29 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. end local function hook_opts(event, _3foptions, ...) local plugins = nil - local function _173_(...) - local _172_0 = _3foptions - if (nil ~= _172_0) then - _172_0 = _172_0.plugins - end - return _172_0 - end local function _176_(...) - local _175_0 = root.options + local _175_0 = _3foptions if (nil ~= _175_0) then _175_0 = _175_0.plugins end return _175_0 end - plugins = (_173_(...) or _176_(...)) + local function _179_(...) + local _178_0 = root.options + if (nil ~= _178_0) then + _178_0 = _178_0.plugins + end + return _178_0 + end + plugins = (_176_(...) or _179_(...)) if plugins then local result = nil for _, plugin in ipairs(plugins) do if result then break end check_plugin_version(plugin) - local _178_0 = plugin[event] - if (nil ~= _178_0) then - local f = _178_0 + local _181_0 = plugin[event] + if (nil ~= _181_0) then + local f = _181_0 result = f(...) else result = nil @@ -5198,7 +5244,7 @@ package.preload["fennel.utils"] = package.preload["fennel.utils"] or function(.. local function hook(event, ...) return hook_opts(event, root.options, ...) end - return {["ast-source"] = ast_source, ["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["every?"] = every_3f, ["expr?"] = expr_3f, ["get-in"] = get_in, ["hook-opts"] = hook_opts, ["idempotent-expr?"] = idempotent_expr_3f, ["kv-table?"] = kv_table_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";"), ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["runtime-version"] = runtime_version, ["sequence?"] = sequence_3f, ["string?"] = string_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, expr = expr, hook = hook, kvmap = kvmap, len = len, list = list, map = map, maxn = maxn, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg, version = version, warn = warn} + return {["ast-source"] = ast_source, ["comment?"] = comment_3f, ["debug-on?"] = debug_on_3f, ["every?"] = every_3f, ["expr?"] = expr_3f, ["fennel-module"] = nil, ["get-in"] = get_in, ["hook-opts"] = hook_opts, ["idempotent-expr?"] = idempotent_expr_3f, ["kv-table?"] = kv_table_3f, ["list?"] = list_3f, ["lua-keywords"] = lua_keywords, ["macro-path"] = table.concat({"./?.fnl", "./?/init-macros.fnl", "./?/init.fnl", getenv("FENNEL_MACRO_PATH")}, ";"), ["member?"] = member_3f, ["multi-sym?"] = multi_sym_3f, ["propagate-options"] = propagate_options, ["quoted?"] = quoted_3f, ["runtime-version"] = runtime_version, ["sequence?"] = sequence_3f, ["string?"] = string_3f, ["sym?"] = sym_3f, ["table?"] = table_3f, ["valid-lua-identifier?"] = valid_lua_identifier_3f, ["varg?"] = varg_3f, ["walk-tree"] = walk_tree, allpairs = allpairs, comment = comment_2a, copy = copy, expr = expr, hook = hook, kvmap = kvmap, len = len, list = list, map = map, maxn = maxn, path = table.concat({"./?.fnl", "./?/init.fnl", getenv("FENNEL_PATH")}, ";"), root = root, sequence = sequence, stablepairs = stablepairs, sym = sym, varg = varg, version = version, warn = warn} end utils = require("fennel.utils") local parser = require("fennel.parser") @@ -5235,14 +5281,14 @@ local function eval(str, _3foptions, ...) local env = eval_env(opts.env, opts) local lua_source = compiler["compile-string"](str, opts) local loader = nil - local function _745_(...) + local function _752_(...) if opts.filename then return ("@" .. opts.filename) else return str end end - loader = specials["load-code"](lua_source, env, _745_(...)) + loader = specials["load-code"](lua_source, env, _752_(...)) opts.filename = nil return loader(...) end @@ -5258,25 +5304,28 @@ local function syntax() local body_3f = {"when", "with-open", "collect", "icollect", "fcollect", "lambda", "\206\187", "macro", "match", "match-try", "case", "case-try", "accumulate", "faccumulate", "doto"} local binding_3f = {"collect", "icollect", "fcollect", "each", "for", "let", "with-open", "accumulate", "faccumulate"} local define_3f = {"fn", "lambda", "\206\187", "var", "local", "macro", "macros", "global"} + local deprecated = {"~=", "#", "global", "require-macros", "pick-args"} local out = {} for k, v in pairs(compiler.scopes.global.specials) do local metadata = (compiler.metadata[v] or {}) - out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = metadata["fnl/body-form?"], ["define?"] = utils["member?"](k, define_3f), ["special?"] = true} + out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = metadata["fnl/body-form?"], ["define?"] = utils["member?"](k, define_3f), ["deprecated?"] = utils["member?"](k, deprecated), ["special?"] = true} end - for k, v in pairs(compiler.scopes.global.macros) do + for k in pairs(compiler.scopes.global.macros) do out[k] = {["binding-form?"] = utils["member?"](k, binding_3f), ["body-form?"] = utils["member?"](k, body_3f), ["define?"] = utils["member?"](k, define_3f), ["macro?"] = true} end for k, v in pairs(_G) do - local _746_0 = type(v) - if (_746_0 == "function") then + local _753_0 = type(v) + if (_753_0 == "function") then out[k] = {["function?"] = true, ["global?"] = true} - elseif (_746_0 == "table") then - for k2, v2 in pairs(v) do - if (("function" == type(v2)) and (k ~= "_G")) then - out[(k .. "." .. k2)] = {["function?"] = true, ["global?"] = true} + elseif (_753_0 == "table") then + if not k:find("^_") then + for k2, v2 in pairs(v) do + if ("function" == type(v2)) then + out[(k .. "." .. k2)] = {["function?"] = true, ["global?"] = true} + end end + out[k] = {["global?"] = true} end - out[k] = {["global?"] = true} end end return out @@ -5290,17 +5339,18 @@ utils["fennel-module"] = mod do local module_name = "fennel.macros" local _ = nil - local function _749_() + local function _757_() return mod end - package.preload[module_name] = _749_ + package.preload[module_name] = _757_ _ = nil local env = nil do - local _750_0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) - _750_0["utils"] = utils - _750_0["fennel"] = mod - env = _750_0 + local _758_0 = specials["make-compiler-env"](nil, compiler.scopes.compiler, {}) + _758_0["utils"] = utils + _758_0["fennel"] = mod + _758_0["get-function-metadata"] = specials["get-function-metadata"] + env = _758_0 end local built_ins = eval([===[;; fennel-ls: macro-file @@ -5405,7 +5455,8 @@ do ,...) closer `(fn close-handlers# [ok# ...] (if ok# ... (error ... 0))) - traceback `(. (or package.loaded.fennel debug) :traceback)] + traceback `(. (or (. package.loaded ,(fennel-module-name)) debug) + :traceback)] (for [i 1 (length closable-bindings) 2] (assert (sym? (. closable-bindings i)) "with-open only allows symbols in bindings") @@ -5468,7 +5519,8 @@ do (let [(into iter has-into?) (extract-into iter-tbl)] (if has-into? `(let [tbl# ,into] - (,how ,iter (table.insert tbl# ,value-expr)) + (,how ,iter (let [val# ,value-expr] + (table.insert tbl# val#))) tbl#) ;; believe it or not, using a var here has a pretty good performance ;; boost: https://p.hagelb.org/icollect-performance.html @@ -5629,19 +5681,16 @@ do has-internal-name? (sym? (. args 1)) arglist (if has-internal-name? (. args 2) (. args 1)) metadata-position (if has-internal-name? 3 2) - has-metadata? (and (< metadata-position args-len) - (or (= :string (type (. args metadata-position))) - (utils.kv-table? (. args metadata-position)))) - arity-check-position (- 4 (if has-internal-name? 0 1) - (if has-metadata? 0 1)) - empty-body? (< args-len arity-check-position)] + (f-metadata check-position) (get-function-metadata [:lambda ...] arglist + metadata-position) + empty-body? (< args-len check-position)] (fn check! [a] (if (table? a) (each [_ a (pairs a)] (check! a)) (let [as (tostring a)] (and (not (as:match "^?")) (not= as "&") (not= as "_") (not= as "...") (not= as "&as"))) - (table.insert args arity-check-position + (table.insert args check-position `(_G.assert (not= nil ,a) ,(: "Missing argument %s on %s:%s" :format (tostring a) @@ -5650,8 +5699,7 @@ do (assert (= :table (type arglist)) "expected arg list") (each [_ a (ipairs arglist)] (check! a)) - (if empty-body? - (table.insert args (sym :nil))) + (if empty-body? (table.insert args (sym :nil))) `(fn ,(unpack args)))) (fn macro* [name ...] @@ -5699,29 +5747,31 @@ do (tset scope.macros import-key (. macros* macro-name)))))) nil) - (fn assert-repl* [condition message ?opts] - "Drop into a debug repl and print the message when condition is false/nil. - Takes an optional table of arguments which will be passed to fennel.repl." + (fn assert-repl* [condition ...] + "Enter into a debug REPL and print the message when condition is false/nil. + Works as a drop-in replacement for Lua's `assert`. + REPL `,return` command returns values to assert in place to continue execution." + {:fnl/arglist [condition ?message ...]} (fn add-locals [{: symmeta : parent} locals] (each [name (pairs symmeta)] (tset locals name (sym name))) (if parent (add-locals parent locals) locals)) - `(let [condition# ,condition - message# (or ,message "assertion failed, entering repl.")] + `(let [unpack# (or table.unpack _G.unpack) + pack# (or table.pack #(doto [$...] (tset :n (select :# $...)))) + ;; need to pack/unpack input args to account for (assert (foo)), + ;; because assert returns *all* arguments upon success + vals# (pack# ,condition ,...) + condition# (. vals# 1) + message# (or (. vals# 2) "assertion failed, entering repl.")] (if (not condition#) - (let [opts# (or ,?opts {:assert-repl? true - :readChunk (?. _G :___repl___ :readChunk) - :onError (?. _G :___repl___ :onError) - :onValued (?. _G :___repl___ :onValued)}) - fennel# (require (or opts#.moduleName :fennel)) + (let [opts# {:assert-repl? true} + fennel# (require ,(fennel-module-name)) locals# ,(add-locals (get-scope) [])] (set opts#.message (fennel#.traceback message#)) (set opts#.env (collect [k# v# (pairs _G) &into locals#] (if (= nil (. locals# k#)) (values k# v#)))) - (_G.assert (fennel#.repl opts#) message#)) - ;; `assert` returns *all* params on success, but omitting opts# to - ;; defensively prevent accidental leakage of REPL opts into code - (values condition# message#)))) + (_G.assert (fennel#.repl opts#))) + (values (unpack# vals# 1 vals#.n))))) {:-> ->* :->> ->>* @@ -5868,13 +5918,12 @@ do (fn case-or [vals pattern guards unifications case-pattern opts] (let [pattern [(unpack pattern 2)] - bindings (symbols-in-every-pattern pattern opts.infer-unification?)] ;; TODO opts.infer-unification instead of opts.unification? + bindings (symbols-in-every-pattern pattern opts.infer-unification?)] (if (= 0 (length bindings)) ;; no bindings special case generates simple code (let [condition (icollect [_ subpattern (ipairs pattern) &into `(or)] - (let [(subcondition subbindings) (case-pattern vals subpattern unifications opts)] - subcondition))] + (case-pattern vals subpattern unifications opts))] (values (if (= 0 (length guards)) condition