Permalink
Browse files

destructure works with if assignment cond

  • Loading branch information...
1 parent 5162082 commit 181e06d9ae423d6005a2ba155d896d14778a134a @leafo committed Nov 29, 2012
@@ -602,15 +602,32 @@ local Statement = Transformer({
["if"] = function(self, node, ret)
if ntype(node[2]) == "assign" then
local _, assign, body = unpack(node)
- local name = assign[2][1]
- return build["do"]({
- assign,
- {
- "if",
- name,
- unpack(node, 3)
+ if destructure.has_destructure(assign[2]) then
+ local name = NameProxy("des")
+ body = {
+ destructure.build_assign(assign[2][1], name),
+ build.group(node[3])
}
- })
+ return build["do"]({
+ build.assign_one(name, assign[3][1]),
+ {
+ "if",
+ name,
+ body,
+ unpack(node, 4)
+ }
+ })
+ else
+ local name = assign[2][1]
+ return build["do"]({
+ assign,
+ {
+ "if",
+ name,
+ unpack(node, 3)
+ }
+ })
+ end
end
node = expand_elseif_assign(node)
if ret then
@@ -668,8 +685,7 @@ local Statement = Transformer({
do
local _with_0 = NameProxy("des")
local proxy = _with_0
- local extracted = destructure.extract_assign_names(name)
- insert(destructures, destructure.build_assign(extracted, proxy))
+ insert(destructures, destructure.build_assign(name, proxy))
_value_0 = _with_0
end
else
@@ -291,11 +291,24 @@ Statement = Transformer {
-- expand assign in cond
if ntype(node[2]) == "assign"
_, assign, body = unpack node
- name = assign[2][1]
- return build["do"] {
- assign
- {"if", name, unpack node, 3}
- }
+ if destructure.has_destructure assign[2]
+ name = NameProxy "des"
+
+ body = {
+ destructure.build_assign assign[2][1], name
+ build.group node[3]
+ }
+
+ return build.do {
+ build.assign_one name, assign[3][1]
+ {"if", name, body, unpack node, 4}
+ }
+ else
+ name = assign[2][1]
+ return build["do"] {
+ assign
+ {"if", name, unpack node, 3}
+ }
node = expand_elseif_assign node
@@ -341,8 +354,7 @@ Statement = Transformer {
node.names = for i, name in ipairs node.names
if ntype(name) == "table"
with proxy = NameProxy "des"
- extracted = destructure.extract_assign_names name
- insert destructures, destructure.build_assign extracted, proxy
+ insert destructures, destructure.build_assign name, proxy
else
name
@@ -46,47 +46,6 @@ has_destructure = function(names)
end
return false
end
-local build_assign
-build_assign = function(extracted_names, receiver)
- local names = { }
- local values = { }
- local inner = {
- "assign",
- names,
- values
- }
- local obj
- if mtype(receiver) == NameProxy then
- obj = receiver
- else
- do
- local _with_0 = NameProxy("obj")
- obj = _with_0
- inner = build["do"]({
- build.assign_one(obj, receiver),
- {
- "assign",
- names,
- values
- }
- })
- obj = _with_0
- end
- end
- local _list_0 = extracted_names
- for _index_0 = 1, #_list_0 do
- local tuple = _list_0[_index_0]
- insert(names, tuple[1])
- insert(values, obj:chain(unpack(tuple[2])))
- end
- return build.group({
- {
- "declare",
- names
- },
- inner
- })
-end
local extract_assign_names
extract_assign_names = function(name, accum, prefix)
if accum == nil then
@@ -143,6 +102,48 @@ extract_assign_names = function(name, accum, prefix)
end
return accum
end
+local build_assign
+build_assign = function(destruct_literal, receiver)
+ local extracted_names = extract_assign_names(destruct_literal)
+ local names = { }
+ local values = { }
+ local inner = {
+ "assign",
+ names,
+ values
+ }
+ local obj
+ if mtype(receiver) == NameProxy then
+ obj = receiver
+ else
+ do
+ local _with_0 = NameProxy("obj")
+ obj = _with_0
+ inner = build["do"]({
+ build.assign_one(obj, receiver),
+ {
+ "assign",
+ names,
+ values
+ }
+ })
+ obj = _with_0
+ end
+ end
+ local _list_0 = extracted_names
+ for _index_0 = 1, #_list_0 do
+ local tuple = _list_0[_index_0]
+ insert(names, tuple[1])
+ insert(values, obj:chain(unpack(tuple[2])))
+ end
+ return build.group({
+ {
+ "declare",
+ names
+ },
+ inner
+ })
+end
local split_assign
split_assign = function(assign)
local names, values = unpack(assign, 2)
@@ -182,8 +183,7 @@ split_assign = function(assign)
end)()
})
end
- local extracted = extract_assign_names(n)
- insert(g, build_assign(extracted, values[i]))
+ insert(g, build_assign(n, values[i]))
start = i + 1
end
end
@@ -237,6 +237,5 @@ end
return {
has_destructure = has_destructure,
split_assign = split_assign,
- extract_assign_names = extract_assign_names,
build_assign = build_assign
}
@@ -18,30 +18,6 @@ has_destructure = (names) ->
return true if ntype(n) == "table"
false
-build_assign = (extracted_names, receiver) ->
- names = {}
- values = {}
-
- inner = {"assign", names, values}
-
- obj = if mtype(receiver) == NameProxy
- receiver
- else
- with obj = NameProxy "obj"
- inner = build.do {
- build.assign_one obj, receiver
- {"assign", names, values}
- }
-
- for tuple in *extracted_names
- insert names, tuple[1]
- insert values, obj\chain unpack tuple[2]
-
- build.group {
- {"declare", names}
- inner
- }
-
extract_assign_names = (name, accum={}, prefix={}) ->
i = 1
for tuple in *name[2]
@@ -70,6 +46,32 @@ extract_assign_names = (name, accum={}, prefix={}) ->
accum
+build_assign = (destruct_literal, receiver) ->
+ extracted_names = extract_assign_names destruct_literal
+
+ names = {}
+ values = {}
+
+ inner = {"assign", names, values}
+
+ obj = if mtype(receiver) == NameProxy
+ receiver
+ else
+ with obj = NameProxy "obj"
+ inner = build.do {
+ build.assign_one obj, receiver
+ {"assign", names, values}
+ }
+
+ for tuple in *extracted_names
+ insert names, tuple[1]
+ insert values, obj\chain unpack tuple[2]
+
+ build.group {
+ {"declare", names}
+ inner
+ }
+
-- applies to destructuring to a assign node
split_assign = (assign) ->
names, values = unpack assign, 2
@@ -93,8 +95,7 @@ split_assign = (assign) ->
values[i]
}
- extracted = extract_assign_names n
- insert g, build_assign extracted, values[i]
+ insert g, build_assign n, values[i]
start = i + 1
@@ -113,4 +114,4 @@ split_assign = (assign) ->
build.group g
-{ :has_destructure, :split_assign, :extract_assign_names, :build_assign }
+{ :has_destructure, :split_assign, :build_assign }
@@ -51,3 +51,28 @@ for {x,y} in *thing
print x,y
+--
+
+with {a,b} = thing
+ print a, b
+
+
+--
+
+thing = nil
+if {a} = thing
+ print a
+else
+ print "nothing"
+
+thang = {1,2}
+if {a,b} = thang
+ print a,b
+
+if {a,b} = thing
+ print a,b
+elseif {c,d} = thang
+ print c,d
+else
+ print "NO"
+
@@ -101,4 +101,47 @@ for _index_0 = 1, #_list_0 do
local _des_0 = _list_0[_index_0]
x, y = _des_0[1], _des_0[2]
print(x, y)
+end
+do
+ local _with_0 = thing
+ a, b = _with_0[1], _with_0[2]
+ print(a, b)
+end
+thing = nil
+do
+ local _des_0 = thing
+ if _des_0 then
+ a = _des_0[1]
+ print(a)
+ else
+ print("nothing")
+ end
+end
+local thang = {
+ 1,
+ 2
+}
+do
+ local _des_0 = thang
+ if _des_0 then
+ a, b = _des_0[1], _des_0[2]
+ print(a, b)
+ end
+end
+do
+ local _des_0 = thing
+ if _des_0 then
+ a, b = _des_0[1], _des_0[2]
+ print(a, b)
+ else
+ do
+ local _des_1 = thang
+ if _des_1 then
+ c, d = _des_1[1], _des_1[2]
+ print(c, d)
+ else
+ return print("NO")
+ end
+ end
+ end
end
View
@@ -1,4 +1,9 @@
# TODO
+#
+#
+#
+
+-- local * and local ^
-- seems like running in moon messes up require order
@@ -8,19 +13,14 @@
- or= and=
-- a do block for making a quick anon func and calling it
-
- error with stray comma at end of line
-- ugly error if attempting to assign to rvalue like #hello
-
-- class expressions, x = class extends Hello do new: => print "hello"
* multiline comments
* table slices (almost)
* combine for and if line decorators
-* export later?
+* export later? nah
x = 232
export x

0 comments on commit 181e06d

Please sign in to comment.