@@ -108,6 +108,22 @@ class Transformer
108108 can_transform : ( node) =>
109109 @transformers [ ntype node] != nil
110110
111+ construct_comprehension = ( inner, clauses) ->
112+ current_stms = inner
113+ for _, clause in reversed clauses
114+ t = clause[ 1 ]
115+ current_stms = if t == " for"
116+ _, names, iter = unpack clause
117+ { " foreach" , names, iter, current_stms}
118+ elseif t == " when"
119+ _, cond = unpack clause
120+ { " if" , cond, current_stms}
121+ else
122+ error " Unknown comprehension clause: " .. t
123+ current_stms = { current_stms}
124+
125+ current_stms[ 1 ]
126+
111127Statement = Transformer {
112128 assign : ( node) =>
113129 _, names, values = unpack node
@@ -185,23 +201,8 @@ Statement = Transformer {
185201
186202 comprehension : ( node, action) =>
187203 _, exp, clauses = unpack node
188-
189204 action = action or ( exp) -> { exp}
190-
191- current_stms = action exp
192- for _, clause in reversed clauses
193- t = clause[ 1 ]
194- current_stms = if t == " for"
195- _, names, iter = unpack clause
196- { " foreach" , names, iter, current_stms}
197- elseif t == " when"
198- _, cond = unpack clause
199- { " if" , cond, current_stms}
200- else
201- error " Unknown comprehension clause: " .. t
202- current_stms = { current_stms}
203-
204- current_stms[ 1 ]
205+ construct_comprehension action( exp) , clauses
205206
206207 -- handle cascading return decorator
207208 if : ( node, ret) =>
@@ -428,6 +429,7 @@ class Accumulator
428429default_accumulator = ( node) =>
429430 Accumulator !\ convert node
430431
432+
431433implicitly_return = ( scope) ->
432434 fn = ( stm) ->
433435 t = ntype stm
@@ -451,6 +453,19 @@ Value = Transformer {
451453 a\ mutate_body { exp} , false
452454 a\ wrap node
453455
456+ tblcomprehension : ( node) =>
457+ _, key_exp, value_exp, clauses = unpack node
458+
459+ accum = NameProxy " tbl"
460+ dest = build. chain { base : accum, { " index" , key_exp} }
461+ inner = build. assign_one dest, value_exp
462+
463+ build. block_exp {
464+ build. assign_one accum, build. table!
465+ construct_comprehension { inner} , clauses
466+ accum
467+ }
468+
454469 fndef : ( node) =>
455470 smart_node node
456471 node. body = apply_to_last node. body, implicitly_return self
0 commit comments