mirror of
https://github.com/leafo/moonscript.git
synced 2024-11-22 02:44:23 +00:00
import done through transform, binding import also works now
This commit is contained in:
parent
4dd7e7dcc0
commit
de3372d96e
@ -92,71 +92,6 @@ line_compile = {
|
|||||||
["break"] = function(self, node)
|
["break"] = function(self, node)
|
||||||
return "break"
|
return "break"
|
||||||
end,
|
end,
|
||||||
import = function(self, node)
|
|
||||||
local _, names, source = unpack(node)
|
|
||||||
local final_names, to_bind = { }, { }
|
|
||||||
local _list_0 = names
|
|
||||||
for _index_0 = 1, #_list_0 do
|
|
||||||
local name = _list_0[_index_0]
|
|
||||||
local final
|
|
||||||
if ntype(name) == ":" then
|
|
||||||
local tmp = self:name(name[2])
|
|
||||||
to_bind[tmp] = true
|
|
||||||
final = tmp
|
|
||||||
else
|
|
||||||
final = self:name(name)
|
|
||||||
end
|
|
||||||
self:put_name(final)
|
|
||||||
insert(final_names, final)
|
|
||||||
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 _accum_0 = { }
|
|
||||||
local _len_0 = 0
|
|
||||||
local _list_1 = final_names
|
|
||||||
for _index_0 = 1, #_list_1 do
|
|
||||||
local name = _list_1[_index_0]
|
|
||||||
_len_0 = _len_0 + 1
|
|
||||||
_accum_0[_len_0] = get_value(name)
|
|
||||||
end
|
|
||||||
return _accum_0
|
|
||||||
end)()
|
|
||||||
local line
|
|
||||||
do
|
|
||||||
local _with_0 = self:line("local ", concat(final_names, ", "), " = ")
|
|
||||||
_with_0:append_list(values, ", ")
|
|
||||||
line = _with_0
|
|
||||||
end
|
|
||||||
return line
|
|
||||||
end
|
|
||||||
self:add(self:line("local ", concat(final_names, ", ")))
|
|
||||||
do
|
|
||||||
local _with_0 = self:block("do")
|
|
||||||
source = _with_0:init_free_var("table", source)
|
|
||||||
local _list_1 = final_names
|
|
||||||
for _index_0 = 1, #_list_1 do
|
|
||||||
local name = _list_1[_index_0]
|
|
||||||
_with_0:stm({
|
|
||||||
"assign",
|
|
||||||
{
|
|
||||||
name
|
|
||||||
},
|
|
||||||
{
|
|
||||||
get_value(name)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
end
|
|
||||||
return _with_0
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
["if"] = function(self, node)
|
["if"] = function(self, node)
|
||||||
local cond, block = node[2], node[3]
|
local cond, block = node[2], node[3]
|
||||||
local root
|
local root
|
||||||
|
@ -52,39 +52,6 @@ line_compile =
|
|||||||
break: (node) =>
|
break: (node) =>
|
||||||
"break"
|
"break"
|
||||||
|
|
||||||
import: (node) =>
|
|
||||||
_, names, source = unpack node
|
|
||||||
|
|
||||||
final_names, to_bind = {}, {}
|
|
||||||
for name in *names
|
|
||||||
final = if ntype(name) == ":"
|
|
||||||
tmp = @name name[2]
|
|
||||||
to_bind[tmp] = true
|
|
||||||
tmp
|
|
||||||
else
|
|
||||||
@name name
|
|
||||||
|
|
||||||
@put_name final
|
|
||||||
insert final_names, final
|
|
||||||
|
|
||||||
get_value = (name) ->
|
|
||||||
if to_bind[name]
|
|
||||||
moonlib.bind source, name
|
|
||||||
else
|
|
||||||
source.."."..name
|
|
||||||
|
|
||||||
-- from constant expression, put it on one line
|
|
||||||
if type(source) == "string"
|
|
||||||
values = [get_value name for name in *final_names]
|
|
||||||
line = with @line "local ", concat(final_names, ", "), " = "
|
|
||||||
\append_list values, ", "
|
|
||||||
return line
|
|
||||||
|
|
||||||
@add @line "local ", concat(final_names, ", ")
|
|
||||||
with @block "do"
|
|
||||||
source = \init_free_var "table", source
|
|
||||||
\stm {"assign", {name}, {get_value name}} for name in *final_names
|
|
||||||
|
|
||||||
if: (node) =>
|
if: (node) =>
|
||||||
cond, block = node[2], node[3]
|
cond, block = node[2], node[3]
|
||||||
root = with @block @line "if ", @value(cond), " then"
|
root = with @block @line "if ", @value(cond), " then"
|
||||||
|
@ -284,7 +284,7 @@ local build_grammar = wrap(function()
|
|||||||
InBlock = Advance * Block * PopIndent,
|
InBlock = Advance * Block * PopIndent,
|
||||||
|
|
||||||
Import = key"import" * Ct(ImportNameList) * key"from" * Exp / mark"import",
|
Import = key"import" * Ct(ImportNameList) * key"from" * Exp / mark"import",
|
||||||
ImportName = (sym"\\" * Ct(Cc":" * Name) + Name),
|
ImportName = (sym"\\" * Ct(Cc"colon_stub" * Name) + Name),
|
||||||
ImportNameList = ImportName * (sym"," * ImportName)^0,
|
ImportNameList = ImportName * (sym"," * ImportName)^0,
|
||||||
|
|
||||||
NameList = Name * (sym"," * Name)^0,
|
NameList = Name * (sym"," * Name)^0,
|
||||||
|
@ -228,6 +228,92 @@ Statement = Transformer({
|
|||||||
exp
|
exp
|
||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
|
import = function(node)
|
||||||
|
local _, names, source = unpack(node)
|
||||||
|
local stubs = (function()
|
||||||
|
local _accum_0 = { }
|
||||||
|
local _len_0 = 0
|
||||||
|
local _list_0 = names
|
||||||
|
for _index_0 = 1, #_list_0 do
|
||||||
|
local name = _list_0[_index_0]
|
||||||
|
local _value_0
|
||||||
|
if type(name) == "table" then
|
||||||
|
_value_0 = name
|
||||||
|
else
|
||||||
|
_value_0 = {
|
||||||
|
"dot",
|
||||||
|
name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
if _value_0 ~= nil then
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = _value_0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
|
local real_names = (function()
|
||||||
|
local _accum_0 = { }
|
||||||
|
local _len_0 = 0
|
||||||
|
local _list_0 = names
|
||||||
|
for _index_0 = 1, #_list_0 do
|
||||||
|
local name = _list_0[_index_0]
|
||||||
|
local _value_0 = type(name) == "table" and name[2] or name
|
||||||
|
if _value_0 ~= nil then
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = _value_0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
|
if type(source) == "string" then
|
||||||
|
return build.assign({
|
||||||
|
names = real_names,
|
||||||
|
values = (function()
|
||||||
|
local _accum_0 = { }
|
||||||
|
local _len_0 = 0
|
||||||
|
local _list_0 = stubs
|
||||||
|
for _index_0 = 1, #_list_0 do
|
||||||
|
local stub = _list_0[_index_0]
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = build.chain({
|
||||||
|
base = source,
|
||||||
|
stub
|
||||||
|
})
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
|
})
|
||||||
|
else
|
||||||
|
local source_name = NameProxy("table")
|
||||||
|
return build.group({
|
||||||
|
{
|
||||||
|
"declare",
|
||||||
|
real_names
|
||||||
|
},
|
||||||
|
build["do"]({
|
||||||
|
build.assign_one(source_name, source),
|
||||||
|
build.assign({
|
||||||
|
names = real_names,
|
||||||
|
values = (function()
|
||||||
|
local _accum_0 = { }
|
||||||
|
local _len_0 = 0
|
||||||
|
local _list_0 = stubs
|
||||||
|
for _index_0 = 1, #_list_0 do
|
||||||
|
local stub = _list_0[_index_0]
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = build.chain({
|
||||||
|
base = source_name,
|
||||||
|
stub
|
||||||
|
})
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end,
|
||||||
comprehension = function(node, action)
|
comprehension = function(node, action)
|
||||||
local _, exp, clauses = unpack(node)
|
local _, exp, clauses = unpack(node)
|
||||||
action = action or function(exp)
|
action = action or function(exp)
|
||||||
|
@ -130,6 +130,36 @@ Statement = Transformer {
|
|||||||
error "Unknown op: "..op if not op_final
|
error "Unknown op: "..op if not op_final
|
||||||
build.assign_one name, {"exp", name, op_final, exp}
|
build.assign_one name, {"exp", name, op_final, exp}
|
||||||
|
|
||||||
|
import: (node) ->
|
||||||
|
_, names, source = unpack node
|
||||||
|
|
||||||
|
stubs = for name in *names
|
||||||
|
if type(name) == "table"
|
||||||
|
name
|
||||||
|
else
|
||||||
|
{"dot", name}
|
||||||
|
|
||||||
|
real_names = for name in *names
|
||||||
|
type(name) == "table" and name[2] or name
|
||||||
|
|
||||||
|
if type(source) == "string"
|
||||||
|
build.assign {
|
||||||
|
names: real_names
|
||||||
|
values: [build.chain { base: source, stub} for stub in *stubs]
|
||||||
|
}
|
||||||
|
else
|
||||||
|
source_name = NameProxy "table"
|
||||||
|
build.group {
|
||||||
|
{"declare", real_names}
|
||||||
|
build["do"] {
|
||||||
|
build.assign_one source_name, source
|
||||||
|
build.assign {
|
||||||
|
names: real_names
|
||||||
|
values: [build.chain { base: source_name, stub} for stub in *stubs]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
comprehension: (node, action) ->
|
comprehension: (node, action) ->
|
||||||
_, exp, clauses = unpack node
|
_, exp, clauses = unpack node
|
||||||
|
|
||||||
|
@ -2,15 +2,25 @@ local hello = yeah.hello
|
|||||||
local hello, world
|
local hello, world
|
||||||
do
|
do
|
||||||
local _table_0 = table["cool"]
|
local _table_0 = table["cool"]
|
||||||
hello = _table_0.hello
|
hello, world = _table_0.hello, _table_0.world
|
||||||
world = _table_0.world
|
|
||||||
end
|
end
|
||||||
local a, b, c = items.a, moon.bind(items.b, items), items.c
|
local a, b, c = items.a, (function()
|
||||||
|
local _base_0 = items
|
||||||
|
local _fn_0 = _base_0.b
|
||||||
|
return function(...)
|
||||||
|
return _fn_0(_base_0, ...)
|
||||||
|
end
|
||||||
|
end)(), items.c
|
||||||
local master, ghost
|
local master, ghost
|
||||||
do
|
do
|
||||||
local _table_0 = find("mytable")
|
local _table_0 = find("mytable")
|
||||||
master = _table_0.master
|
master, ghost = _table_0.master, (function()
|
||||||
ghost = moon.bind(_table_0.ghost, _table_0)
|
local _base_0 = _table_0
|
||||||
|
local _fn_0 = _base_0.ghost
|
||||||
|
return function(...)
|
||||||
|
return _fn_0(_base_0, ...)
|
||||||
|
end
|
||||||
|
end)()
|
||||||
end
|
end
|
||||||
local yumm
|
local yumm
|
||||||
a, yumm = 3434, "hello"
|
a, yumm = 3434, "hello"
|
||||||
@ -24,7 +34,12 @@ if indent then
|
|||||||
local okay, well
|
local okay, well
|
||||||
do
|
do
|
||||||
local _table_1 = tables[100]
|
local _table_1 = tables[100]
|
||||||
okay = _table_1.okay
|
okay, well = _table_1.okay, (function()
|
||||||
well = moon.bind(_table_1.well, _table_1)
|
local _base_0 = _table_1
|
||||||
|
local _fn_0 = _base_0.well
|
||||||
|
return function(...)
|
||||||
|
return _fn_0(_base_0, ...)
|
||||||
|
end
|
||||||
|
end)()
|
||||||
end
|
end
|
||||||
end
|
end
|
Loading…
Reference in New Issue
Block a user