fully moonspeak compiler

This commit is contained in:
leaf corcoran 2011-06-12 22:38:42 -07:00
parent 1bea9f1402
commit f5c5e9fde3
9 changed files with 738 additions and 96 deletions

2
moon
View File

@ -3,7 +3,7 @@
module("moonscript", package.seeall) module("moonscript", package.seeall)
require "moonscript.parse" require "moonscript.parse"
require "moonscript.compile" require "moonscript.compile2"
require "moonscript.util" require "moonscript.util"
require "alt_getopt" require "alt_getopt"

2
moonc
View File

@ -3,7 +3,7 @@
module("moonscript", package.seeall) module("moonscript", package.seeall)
require "moonscript.parse" require "moonscript.parse"
require "moonscript.compile" require "moonscript.compile2"
require "moonscript.util" require "moonscript.util"
require "alt_getopt" require "alt_getopt"

View File

@ -22,7 +22,7 @@ dependencies = {
build = { build = {
type = "builtin", type = "builtin",
modules = { modules = {
["moonscript.compile"] = "moonscript/compile.lua", ["moonscript.compile2"] = "moonscript/compile2.lua",
["moonscript.parse"] = "moonscript/parse.lua", ["moonscript.parse"] = "moonscript/parse.lua",
["moonscript.dump"] = "moonscript/dump.lua", ["moonscript.dump"] = "moonscript/dump.lua",
["moonscript.data"] = "moonscript/data.lua", ["moonscript.data"] = "moonscript/data.lua",

606
moonscript/compile2.lua Normal file
View File

@ -0,0 +1,606 @@
module("moonscript.compile", package.seeall)
local util = require("moonscript.util")
local data = require("moonscript.data")
local dump = require("moonscript.dump")
local map, bind, itwos, every, reversed = util.map, util.bind, util.itwos, util.every, util.reversed
local Stack, Set, ntype = data.Stack, data.Set, data.ntype
local concat, insert = table.concat, table.insert
local indent_char = " "
local pretty
pretty = function(lines, indent)
indent = indent or ""
local render
render = function(line)
if type(line) == "table" then
return indent_char .. pretty(line, indent .. indent_char)
else
return line
end
end
lines = (function()
local _moon_0 = {}
local _item_0 = lines
for _index_0=1,#_item_0 do
local line = _item_0[_index_0]
table.insert(_moon_0, render(line))
end
return _moon_0
end)()
local fix
fix = function(i, left, k, right)
if left:sub(-1) == ")" and right:sub(1, 1) == "(" then
lines[i] = lines[i] .. ";"
end
end
for i, l, k, r in itwos(lines) do
fix(i, l, k, r)
end
return concat(lines, "\n" .. indent)
end
local returner
returner = function(exp)
if ntype(exp) == "chain" and exp[2] == "return" then
local items = { "explist" }
local _item_0 = exp[3][2]
for _index_0=1,#_item_0 do
local v = _item_0[_index_0]
insert(items, v)
end
return { "return", items }
else
return { "return", exp }
end
end
local moonlib = { bind = function(tbl, name) return concat({
"moon.bind(",
tbl,
".",
name,
", ",
tbl,
")"
}) end }
local cascading = Set({ "if" })
local has_value
has_value = function(node)
if ntype(node) == "chain" then
local ctype = ntype(node[#node])
return ctype ~= "call" and ctype ~= "colon"
else
return true
end
end
local line_compile = {
assign = function(self, node)
local _, names, values = unpack(node)
local undeclared = (function()
local _moon_0 = {}
local _item_0 = names
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
if type(name) == "string" and not self:has_name(name) then
table.insert(_moon_0, name)
end
end
return _moon_0
end)()
local _item_0 = undeclared
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
self:put_name(name)
end
local declare = "local " .. (concat(undeclared, ", "))
if self:is_stm(values) then
if #undeclared > 0 then
self:add_line(declare)
end
if cascading[ntype(values)] then
local decorate
decorate = function(value) return { "assign", names, { value } } end
return self:stm(values, decorate)
else
return self:add_line(concat((function()
local _moon_0 = {}
local _item_0 = names
for _index_0=1,#_item_0 do
local n = _item_0[_index_0]
table.insert(_moon_0, self:value(n))
end
return _moon_0
end)(), ", ") .. " = " .. self:value(values))
end
else
local has_fndef = false
local i = 1
while i <= #values do
if ntype(values[i]) == "fndef" then
has_fndef = true
end
i = i + 1
end
values = concat((function()
local _moon_0 = {}
local _item_0 = values
for _index_0=1,#_item_0 do
local v = _item_0[_index_0]
table.insert(_moon_0, self:value(v))
end
return _moon_0
end)(), ", ")
if #undeclared == #names and not has_fndef then
return self:add_line(declare .. ' = ' .. values)
else
if #undeclared > 0 then
self:add_line(declare)
end
return self:add_line(concat((function()
local _moon_0 = {}
local _item_0 = names
for _index_0=1,#_item_0 do
local n = _item_0[_index_0]
table.insert(_moon_0, self:value(n))
end
return _moon_0
end)(), ", ") .. " = " .. values)
end
end
end,
["return"] = function(self, node) return self:add_line("return", self:value(node[2])) end,
["import"] = function(self, node)
local _, names, source = unpack(node)
local to_bind = { }
local get_name
get_name = function(name)
if ntype(name) == ":" then
local tmp = self:name(name[2])
to_bind[tmp] = true
return tmp
else
return self:name(name)
end
end
local final_names = (function()
local _moon_0 = {}
local _item_0 = names
for _index_0=1,#_item_0 do
local n = _item_0[_index_0]
table.insert(_moon_0, get_name(n))
end
return _moon_0
end)()
local _item_0 = final_names
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
self:put_name(name)
end
local get_value
get_value = function(name)
if to_bind[name] then
return moonlib.bind(source, name)
else
return source .. "." .. name
end
end
if type(source) == "string" then
local values = (function()
local _moon_0 = {}
local _item_0 = final_names
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
table.insert(_moon_0, get_value(name))
end
return _moon_0
end)()
self:add_line("local", (concat(final_names, ", ")), "=", (concat(values, ", ")))
return(nil)
end
self:add_line("local", concat(final_names, ", "))
self:add_line("do")
local inner = self:block()
local tmp_name = inner:free_name("table")
inner:add_line("local", tmp_name, "=", self:value(source))
source = tmp_name
local _item_0 = final_names
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
inner:add_line(name .. " = " .. get_value(name))
end
self:add_line(inner:render())
return self:add_line("end")
end,
["if"] = function(self, node, ret)
local cond, block = node[2], node[3]
local add_clause
add_clause = function(clause)
local type = clause[1]
if type == "else" then
self:add_line("else")
block = clause[2]
else
self:add_line("elseif", (self:value(clause[2])), "then")
block = clause[3]
end
local b = self:block()
b:stms(block, ret)
return self:add_line(b:render())
end
self:add_line("if", (self:value(cond)), "then")
local b = self:block()
b:stms(block, ret)
self:add_line(b:render())
for i, cond in ipairs(node) do
if i > 3 then
add_clause(cond)
end
end
return self:add_line("end")
end,
["while"] = function(self, node)
local _, cond, block = unpack(node)
self:add_line("while", self:value(cond), "do")
local inner = self:block()
inner:stms(block)
self:add_line(inner:render())
return self:add_line("end")
end,
comprehension = function(self, node, action)
local _, exp, clauses = unpack(node)
if not action then
action = self:block()
action:stm(exp)
end
local depth = #clauses
action:set_indent(self.indent + depth)
local render_clause
render_clause = function(self, clause)
local t = clause[1]
action = self:block()
action:set_indent(-1 + self.indent)
if "for" == t then
local names, iter
_, names, iter = unpack(clause)
local name_list = concat((function()
local _moon_0 = {}
local _item_0 = names
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
table.insert(_moon_0, self:name(name))
end
return _moon_0
end)(), ", ")
if ntype(iter) == "unpack" then
iter = iter[2]
local items_tmp = self:free_name("item")
local index_tmp = self:free_name("index")
insert(self._lines, 1, ("local %s = %s[%s]"):format(name_list, items_tmp, index_tmp))
return action:add_lines({
("local %s = %s"):format(items_tmp, self:value(iter)),
("for %s=1,#%s do"):format(index_tmp, items_tmp),
self:render(true),
"end"
})
else
return action:add_lines({ ("for %s in %s do"):format(name_list, self:value(iter)), self:render(true), "end" })
end
elseif "when" == t then
local cond
_, cond = unpack(clause)
return action:add_lines({ ("if %s then"):format(self:value(cond)), self:render(true), "end" })
else
return error("Unknown comprehension clause: " .. t)
end
end
for i, clause in reversed(clauses) do
render_clause(action, clause)
end
return self:add_lines(action._lines)
end
}
local value_compile = {
exp = function(self, node)
local _comp
_comp = function(i, value)
if i % 2 == 1 and value == "!=" then
value = "~="
end
return self:value(value)
end
return concat((function()
local _moon_0 = {}
for i, v in ipairs(node) do
if i > 1 then
table.insert(_moon_0, _comp(i, v))
end
end
return _moon_0
end)(), " ")
end,
explist = function(self, node) return concat((function()
local _moon_0 = {}
for i, v in ipairs(node) do
if i > 1 then
table.insert(_moon_0, self:value(v))
end
end
return _moon_0
end)(), ", ") end,
parens = function(self, node) return "(" .. (self:value(node[2])) .. ")" end,
string = function(self, node)
local _, delim, inner, delim_end = unpack(node)
return delim .. inner .. (delim_end or delim)
end,
["if"] = function(self, node)
local func = self:block()
func:stm(node, returner)
return self:format("(function()", func:render(), "end)()")
end,
comprehension = function(self, node)
local exp = node[2]
local func = self:block()
local tmp_name = func:free_name()
func:add_line("local", tmp_name, "= {}")
local action = func:block()
action:add_line(("table.insert(%s, %s)"):format(tmp_name, func:value(exp)))
func:stm(node, action)
func:add_line("return", tmp_name)
return self:format("(function()", func:render(), "end)()")
end,
chain = function(self, node)
local callee = node[2]
local chain_item
chain_item = function(node)
local t, arg = unpack(node)
if t == "call" then
return "(" .. (self:values(arg)) .. ")"
elseif t == "index" then
return "[" .. (self:value(arg)) .. "]"
elseif t == "dot" then
return "." .. arg
elseif t == "colon" then
return ":" .. arg .. (chain_item(node[3]))
else
return error("Unknown chain action: " .. t)
end
end
local actions = (function()
local _moon_0 = {}
for i, act in ipairs(node) do
if i > 2 then
table.insert(_moon_0, chain_item(act))
end
end
return _moon_0
end)()
if ntype(callee) == "self" and node[3] and ntype(node[3]) == "call" then
callee[1] = "self_colon"
end
local callee_value = self:name(callee)
if ntype(callee) == "exp" then
callee_value = "(" .. callee_value .. ")"
end
return self:name(callee) .. concat(actions)
end,
fndef = function(self, node)
local _, args, arrow, block = unpack(node)
if arrow == "fat" then
insert(args, 1, "self")
end
local b = self:block()
local _item_0 = args
for _index_0=1,#_item_0 do
local name = _item_0[_index_0]
b:put_name(name)
end
b:ret_stms(block)
local decl = "function(" .. (concat(args, ", ")) .. ")"
if #b._lines == 0 then
return decl .. " end"
elseif #b._lines == 1 then
return concat({ decl, b._lines[1], "end" }, " ")
else
return self:format(decl, b._lines, "end")
end
end,
table = function(self, node)
local _, items = unpack(node)
local inner = self:block()
local _comp
_comp = function(i, tuple)
local out
if #tuple == 2 then
local key, value = unpack(tuple)
if type(key) ~= "string" then
key = ("[%s]"):format(self:value(key))
else
key = self:value(key)
end
out = ("%s = %s"):format(key, inner:value(value))
else
out = inner:value(tuple[1])
end
if i ~= #items then
return out .. ","
else
return out
end
end
local values = (function()
local _moon_0 = {}
for i, v in ipairs(items) do
table.insert(_moon_0, _comp(i, v))
end
return _moon_0
end)()
if #values > 3 then
return self:format("{", values, "}")
else
return "{ " .. (concat(values, " ")) .. " }"
end
end,
minus = function(self, node) return "-" .. self:value(node[2]) end,
length = function(self, node) return "#" .. self:value(node[2]) end,
["not"] = function(self, node) return "not " .. self:value(node[2]) end,
self = function(self, node) return "self." .. self:value(node[2]) end,
self_colon = function(self, node) return "self:" .. self:value(node[2]) end
}
local block_t = { }
local Block
Block = function(parent)
local indent = parent and parent.indent + 1 or 0
local b = setmetatable({ _lines = { }, _names = { }, parent = parent }, block_t)
b:set_indent(indent)
return b
end
local B = {
set_indent = function(self, depth)
self.indent = depth
self.lead = indent_char:rep(self.indent)
end,
put_name = function(self, name) self._names[name] = true end,
has_name = function(self, name)
if self._names[name] then
return true
elseif self.parent then
return self.parent:has_name(name)
else
return false
end
end,
free_name = function(self, prefix)
prefix = prefix or "moon"
local searching = true
local name, i = nil, 0
while searching do
name = concat({ "", prefix, i }, "_")
i = i + 1
searching = self:has_name(name)
end
self:put_name(name)
return name
end,
add_lines = function(self, lines)
local _item_0 = lines
for _index_0=1,#_item_0 do
local line = _item_0[_index_0]
insert(self._lines, line)
end
return nil
end,
add_line = function(self, ...)
local args = { ... }
local line
if #args == 1 then
line = args[1]
else
line = concat(args, " ")
end
return insert(self._lines, line)
end,
push = function(self) self._names = setmetatable({ }, { __index = self._names }) end,
pop = function(self) self._names = getmetatable(self._names).__index end,
format = function(self, ...) return pretty({ ... }, self.lead) end,
render = function(self)
local out = pretty(self._lines, self.lead)
if self.indent > 0 then
out = indent_char .. out
end
return out
end,
block = function(self, node) return Block(self) end,
is_stm = function(self, node) return line_compile[ntype(node)] ~= nil end,
is_value = function(self, node)
local t = ntype(node)
return value_compile[t] ~= nil or t == "value"
end,
name = function(self, node) return self:value(node) end,
value = function(self, node, ...)
if type(node) ~= "table" then
return(tostring(node))
end
local fn = value_compile[node[1]]
if not fn then
error("Failed to compile value: " .. dump.value(node))
end
return fn(self, node, ...)
end,
values = function(self, values, delim)
delim = delim or ', '
return concat((function()
local _moon_0 = {}
local _item_0 = values
for _index_0=1,#_item_0 do
local v = _item_0[_index_0]
table.insert(_moon_0, self:value(v))
end
return _moon_0
end)(), delim)
end,
stm = function(self, node, ...)
local fn = line_compile[ntype(node)]
if not fn then
if has_value(node) then
return self:stm({ "assign", { "_" }, { node } })
else
return self:add_line(self:value(node))
end
else
local out = fn(self, node, ...)
if out then
return self:add_line(out)
end
end
end,
ret_stms = function(self, stms, ret)
if not ret then
ret = returner
end
local i = 1
while i < #stms do
self:stm(stms[i])
i = i + 1
end
local last_exp = stms[i]
if last_exp then
if cascading[ntype(last_exp)] then
self:stm(last_exp, ret)
elseif self:is_value(last_exp) then
local line = ret(stms[i])
if self:is_stm(line) then
self:stm(line)
else
error("got a value from implicit return")
end
else
self:stm(last_exp)
end
end
return nil
end,
stms = function(self, stms, ret)
if ret then
self:ret_stms(stms, ret)
else
local _item_0 = stms
for _index_0=1,#_item_0 do
local stm = _item_0[_index_0]
self:stm(stm)
end
end
return nil
end
}
block_t.__index = B
local build_compiler
build_compiler = function()
Block(nil)
return setmetatable({ }, { __index = compiler_index })
end
_M.tree = function(tree)
local scope = Block()
local _item_0 = tree
for _index_0=1,#_item_0 do
local line = _item_0[_index_0]
scope:stm(line)
end
return scope:render()
end

View File

@ -18,7 +18,24 @@ pretty = (lines, indent) ->
else else
line line
concat [render line for line in *lines], "\n"..indent lines = [render line for line in *lines]
-- add semicolons for ambiguities
fix = (i, left, k, right) ->
if left:sub(-1) == ")" and right:sub(1,1) == "("
lines[i] = lines[i]..";"
fix(i,l, k,r) for i,l,k,r in itwos lines
concat lines, "\n"..indent
returner = (exp) ->
if ntype(exp) == "chain" and exp[2] == "return"
-- extract the return
items = {"explist"}
insert items, v for v in *exp[3][2]
{"return", items}
else
{"return", exp}
moonlib = moonlib =
bind: (tbl, name) -> bind: (tbl, name) ->
@ -29,7 +46,8 @@ cascading = Set{ "if" }
-- does this always return a value -- does this always return a value
has_value = (node) -> has_value = (node) ->
if ntype(node) == "chain" if ntype(node) == "chain"
ntype(node[#node]) != "call" ctype = ntype(node[#node])
ctype != "call" and ctype != "colon"
else else
true true
@ -53,8 +71,19 @@ line_compile =
else else
@add_line concat([@value n for n in *names], ", ").." = "..@value values @add_line concat([@value n for n in *names], ", ").." = "..@value values
else else
has_fndef = false
i = 1
while i <= #values
if ntype(values[i]) == "fndef"
has_fndef = true
i = i +1
-- need new compiler
-- (if ntype(v) == "fndef" then has_fndef = true) for v in *values
values = concat [@value v for v in *values], ", " values = concat [@value v for v in *values], ", "
if #undeclared == #names
if #undeclared == #names and not has_fndef
@add_line declare..' = '..values @add_line declare..' = '..values
else else
@add_line declare if #undeclared > 0 @add_line declare if #undeclared > 0
@ -80,7 +109,7 @@ line_compile =
get_value = (name) -> get_value = (name) ->
if to_bind[name] if to_bind[name]
moonlib.bind name, source moonlib.bind source, name
else else
source.."."..name source.."."..name
@ -133,7 +162,7 @@ line_compile =
["while"]: (node) => ["while"]: (node) =>
_, cond, block = unpack node _, cond, block = unpack node
@add_line "while "..@value cond @add_line "while", @value(cond), "do"
inner = @block() inner = @block()
inner:stms block inner:stms block
@ -195,7 +224,7 @@ line_compile =
value_compile = value_compile =
exp: (node) => exp: (node) =>
_comp = (i, value) -> _comp = (i, value) ->
if i % 1 == 1 and value == "!=" if i % 2 == 1 and value == "!="
value = "~=" value = "~="
@value value @value value
@ -214,7 +243,7 @@ value_compile =
["if"]: (node) => ["if"]: (node) =>
func = @block() func = @block()
func:stm node, (exp) -> {"return", exp} func:stm node, returner
@format "(function()", func:render(), "end)()" @format "(function()", func:render(), "end)()"
comprehension: (node) => comprehension: (node) =>
@ -279,6 +308,7 @@ value_compile =
table: (node) => table: (node) =>
_, items = unpack node _, items = unpack node
inner = @block() -- handle indent
_comp = (i, tuple) -> _comp = (i, tuple) ->
out = if #tuple == 2 out = if #tuple == 2
key, value = unpack tuple key, value = unpack tuple
@ -286,9 +316,9 @@ value_compile =
("[%s]"):format @value key ("[%s]"):format @value key
else else
@value key @value key
("%s = %s"):format key, @value value ("%s = %s"):format key, inner:value value
else else
@value tuple[1] inner:value tuple[1]
out.."," if i != #items else out out.."," if i != #items else out
@ -297,7 +327,7 @@ value_compile =
if #values > 3 if #values > 3
@format "{", values, "}" @format "{", values, "}"
else else
"{ "..(concat values, " ").."}" "{ "..(concat values, " ").." }"
minus: (node) => minus: (node) =>
"-"..@value node[2] "-"..@value node[2]
@ -414,7 +444,7 @@ B =
ret_stms: (stms, ret) => ret_stms: (stms, ret) =>
if not ret if not ret
ret = (exp) -> {"return", exp} ret = returner
-- wow I really need a for loop -- wow I really need a for loop
i = 1 i = 1

View File

@ -8,7 +8,11 @@ pcall(function()
gettime = socket.gettime gettime = socket.gettime
end) end)
local opts, ind = alt_getopt.get_opts(arg, "d:", { }) require "moonscript.parse"
require "moonscript.compile2"
local parse, compile = moonscript.parse, moonscript.compile
local opts, ind = alt_getopt.get_opts(arg, "qd:", { })
local argv = {} local argv = {}
for i = ind, #arg do table.insert(argv, arg[i]) end for i = ind, #arg do table.insert(argv, arg[i]) end
@ -16,6 +20,7 @@ for i = ind, #arg do table.insert(argv, arg[i]) end
local action = table.remove(argv, 1) or "run" local action = table.remove(argv, 1) or "run"
local diff_tool = opts.d or "diff" local diff_tool = opts.d or "diff"
local quiet = opts.q
local opts = { local opts = {
in_dir = "tests/inputs", in_dir = "tests/inputs",
@ -37,8 +42,6 @@ local function run_file(name, benchmark)
name = input_name(name) name = input_name(name)
file_str = io.open(name):read("*a") file_str = io.open(name):read("*a")
local parse = require "moonscript.parse"
local compile = require "moonscript.compile"
local start_parse local start_parse
@ -112,7 +115,10 @@ local actions = {
local tmp = io.open(tmp_name, "w") local tmp = io.open(tmp_name, "w")
tmp:write(result) tmp:write(result)
tmp:close() tmp:close()
print(diff(correct_fname, tmp_name))
if not quiet then
print(diff(correct_fname, tmp_name))
end
os.remove(tmp_name) os.remove(tmp_name)
-- break -- break
else else

View File

@ -1,4 +1,5 @@
local _ = function() local _
_ = function()
local joop = 2302 local joop = 2302
return function(hi) return function(hi)
local d = 100 local d = 100

View File

@ -1,14 +1,14 @@
local hi = (function() local hi = (function()
local tmp = {} local _moon_0 = {}
for _, x in ipairs({ for _, x in ipairs({
1, 1,
2, 2,
3, 3,
4 4
}) do }) do
table.insert(tmp, x * 2) table.insert(_moon_0, x * 2)
end end
return tmp return _moon_0
end)() end)()
local items = { local items = {
1, 1,
@ -19,11 +19,11 @@ local items = {
6 6
} }
local mm = (function() local mm = (function()
local tmp = {} local _moon_0 = {}
for self.x in ipairs(items) do for self.x in ipairs(items) do
table.insert(tmp, self.x) table.insert(_moon_0, self.x)
end end
return tmp return _moon_0
end)() end)()
for z in ipairs(items) do for z in ipairs(items) do
if z > 4 then if z > 4 then
@ -31,25 +31,25 @@ for z in ipairs(items) do
end end
end end
local rad = (function() local rad = (function()
local tmp = {} local _moon_0 = {}
for a in ipairs({ for a in ipairs({
1, 1,
2, 2,
3, 3,
4, 4,
5, 5,
6 6
}) do }) do
if good_number(a) then if good_number(a) then
table.insert(tmp, { a }) table.insert(_moon_0, { a })
end end
end end
return tmp return _moon_0
end)() end)()
for z in items do for z in items do
for j in list do for j in list do
if z > 4 then if z > 4 then
_ = z local _ = z
end end
end end
end end
@ -59,43 +59,43 @@ dump = function(x) return print(util.dump(x)) end
local range local range
range = function(count) range = function(count)
local i = 0 local i = 0
return(coroutine.wrap(function() return coroutine.wrap(function()
while i < count do while i < count do
coroutine.yield(i) coroutine.yield(i)
i = i + 1 i = i + 1
end end
end)) end)
end end
dump((function() dump((function()
local tmp = {} local _moon_0 = {}
for x in range(10) do for x in range(10) do
table.insert(tmp, x) table.insert(_moon_0, x)
end end
return tmp return _moon_0
end)()) end)())
dump((function() dump((function()
local tmp = {} local _moon_0 = {}
for x in range(5) do for x in range(5) do
if x > 2 then if x > 2 then
for y in range(5) do for y in range(5) do
table.insert(tmp, { x, y }) table.insert(_moon_0, { x, y })
end end
end end
end end
return tmp return _moon_0
end)()) end)())
local things = (function() local things = (function()
local tmp = {} local _moon_0 = {}
for x in range(10) do for x in range(10) do
if x > 5 then if x > 5 then
for y in range(10) do for y in range(10) do
if y > 7 then if y > 7 then
table.insert(tmp, x + y) table.insert(_moon_0, x + y)
end end
end end
end end
end end
return tmp return _moon_0
end)() end)()
for x in ipairs({ 1, 2, 4 }) do for x in ipairs({ 1, 2, 4 }) do
for y in ipairs({ 1, 2, 3 }) do for y in ipairs({ 1, 2, 3 }) do
@ -108,14 +108,14 @@ for x in items do
print("hello", x) print("hello", x)
end end
for x in x do for x in x do
_ = x local _ = x
end end
local x = (function() local x = (function()
local tmp = {} local _moon_0 = {}
for x in x do for x in x do
table.insert(tmp, x) table.insert(_moon_0, x)
end end
return tmp return _moon_0
end)() end)()
for x in ipairs({ 1, 2, 4 }) do for x in ipairs({ 1, 2, 4 }) do
for y in ipairs({ 1, 2, 3 }) do for y in ipairs({ 1, 2, 3 }) do
@ -125,45 +125,45 @@ for x in ipairs({ 1, 2, 4 }) do
end end
end end
local double = (function() local double = (function()
local tmp = {} local _moon_0 = {}
local _items_0 = items local _item_0 = items
for _index_0=1,#_items_0 do for _index_0=1,#_item_0 do
local x = _items_0[_index_0] local x = _item_0[_index_0]
table.insert(tmp, x * 2) table.insert(_moon_0, x * 2)
end end
return tmp return _moon_0
end)() end)()
local _items_0 = double local _item_0 = double
for _index_0=1,#_items_0 do for _index_0=1,#_item_0 do
local x = _items_0[_index_0] local x = _item_0[_index_0]
print(x) print(x)
end end
local cut = (function() local cut = (function()
local tmp = {} local _moon_0 = {}
local _items_0 = items local _item_0 = items
for _index_0=1,#_items_0 do for _index_0=1,#_item_0 do
local x = _items_0[_index_0] local x = _item_0[_index_0]
if x > 3 then if x > 3 then
table.insert(tmp, x) table.insert(_moon_0, x)
end end
end end
return tmp return _moon_0
end)() end)()
local hello = (function() local hello = (function()
local tmp = {} local _moon_0 = {}
local _items_1 = items local _item_1 = items
for _index_1=1,#_items_1 do for _index_1=1,#_item_1 do
local x = _items_1[_index_1] local x = _item_1[_index_1]
local _items_0 = items local _item_0 = items
for _index_0=1,#_items_0 do for _index_0=1,#_item_0 do
local y = _items_0[_index_0] local y = _item_0[_index_0]
table.insert(tmp, x + y) table.insert(_moon_0, x + y)
end end
end end
return tmp return _moon_0
end)() end)()
local _items_0 = hello local _item_0 = hello
for _index_0=1,#_items_0 do for _index_0=1,#_item_0 do
local z = _items_0[_index_0] local z = _item_0[_index_0]
print(z) print(z)
end end

View File

@ -1,9 +1,8 @@
local x local x
x = function() return print(what) end x = function() return print(what) end
local _ = function() end local _
_ = function() _ = function() end
return function() return function() end end _ = function() return function() return function() end end end
end
go(to(the(barn))) go(to(the(barn)))
open(function() return the(function() return door end) end) open(function() return the(function() return door end) end)
open(function() open(function()
@ -31,8 +30,8 @@ fun(a)(b)
fun(a)(b, bad(hello)) fun(a)(b, bad(hello))
hello(world(what(are(you(doing(here)))))) hello(world(what(are(you(doing(here))))))
what(the)[3243](world, yeck(heck)) what(the)[3243](world, yeck(heck))
hairy[hands][are](gross)(okay(okay[world])); hairy[hands][are](gross)(okay(okay[world]))
(get[something] + 5)[years] _ = (get[something] + 5)[years]
local i local i
i, x = 200, 300 i, x = 200, 300
local yeah = (1 + 5) * 3 local yeah = (1 + 5) * 3
@ -49,16 +48,16 @@ end)
something('else', "ya") something('else', "ya")
something('else') something('else')
something("else") something("else")
here(we)("go")[12123] _ = here(we)("go")[12123]
local something = { test = 12323, what = function() return print("hello world") end } local something = { test = 12323, what = function() return print("hello world") end }
print(something.test) print(something.test)
local frick = { hello = "world" } local frick = { hello = "world" }
local argon = { num = 100, world = function(self) local argon = { num = 100, world = function(self)
print(self.num) print(self.num)
return({ something = function() return print("hi from something") end }) return { something = function() return print("hi from something") end }
end, somethin = function(self,str) end, somethin = function(self, str)
print("string is", str) print("string is", str)
return({ world = function(a,b) return print("sum", a + b) end }) return { world = function(a, b) return print("sum", a + b) end }
end } end }
something.what() something.what()
argon:world().something() argon:world().something()
@ -67,11 +66,11 @@ x = -434
x = -hello(world(one(two))) x = -hello(world(one(two)))
local hi = -"herfef" local hi = -"herfef"
x = -(function() x = -(function()
local tmp = {} local _moon_0 = {}
for x in x do for x in x do
table.insert(tmp, x) table.insert(_moon_0, x)
end end
return tmp return _moon_0
end)() end)()
if cool then if cool then
print("hello") print("hello")