@@ -194,9 +194,12 @@ defmodule ElixirScript.Translate.Forms.Pattern do
194194
195195 defp process_pattern ( { :<<>> , _ , elements } , state ) do
196196 params = Enum . reduce ( elements , [ ] , fn
197- ( { ::: , _ , [ { variable , _ , params } , _ ] } , state ) when is_nil ( params )
197+ ( { ::: , _ , [ { _ , _ , params } = ast , _ ] } , state ) when is_nil ( params )
198198 when is_list ( params ) and length ( params ) == 0 ->
199- state ++ [ ElixirScript.Translate.Identifier . make_identifier ( variable ) ]
199+
200+ var_str = make_identifier ( ast )
201+ var_atom = String . to_atom ( var_str )
202+ state ++ [ ElixirScript.Translate.Identifier . make_identifier ( var_atom ) ]
200203 _ , state ->
201204 state
202205 end )
@@ -215,16 +218,18 @@ defmodule ElixirScript.Translate.Forms.Pattern do
215218 { [ PM . starts_with ( prefix ) ] , [ Form . compile! ( value , state ) ] }
216219 end
217220
218- defp process_pattern ( { := , _ , [ { name , _ , _ } , right ] } , state ) when not name in [ :% , :{} , :^ , :%{} , :<<>> ] do
219- unify ( name , right , state )
221+ defp process_pattern ( { := , _ , [ { name , _ , _ } = target , right ] } , state ) when not name in [ :% , :{} , :^ , :%{} , :<<>> ] do
222+ unify ( target , right , state )
220223 end
221224
222- defp process_pattern ( { := , _ , [ left , { name , _ , _ } ] } , state ) when not name in [ :% , :{} , :^ , :%{} , :<<>> ] do
223- unify ( name , left , state )
225+ defp process_pattern ( { := , _ , [ left , { name , _ , _ } = target ] } , state ) when not name in [ :% , :{} , :^ , :%{} , :<<>> ] do
226+ unify ( target , left , state )
224227 end
225228
226- defp process_pattern ( { var , _ , a } , _ ) when is_atom ( a ) do
227- { [ PM . parameter ( J . literal ( to_string ( var ) ) ) ] , [ ElixirScript.Translate.Identifier . make_identifier ( var ) ] }
229+ defp process_pattern ( { _ , _ , a } = ast , _ ) when is_atom ( a ) do
230+ var_str = make_identifier ( ast )
231+ var_atom = String . to_atom ( var_str )
232+ { [ PM . parameter ( J . literal ( var_str ) ) ] , [ ElixirScript.Translate.Identifier . make_identifier ( var_atom ) ] }
228233 end
229234
230235 defp process_pattern ( ast , state ) do
@@ -240,6 +245,22 @@ defmodule ElixirScript.Translate.Forms.Pattern do
240245
241246 defp unify ( target , source , state ) do
242247 { patterns , params } = do_compile ( [ source ] , state )
243- { [ PM . capture ( hd ( patterns ) ) ] , params ++ [ ElixirScript.Translate.Identifier . make_identifier ( target ) ] }
248+ { [ _ ] , [ param ] } = process_pattern ( target , state )
249+ { [ PM . capture ( hd ( patterns ) ) ] , params ++ [ param ] }
250+ end
251+
252+ def get_counter ( meta ) do
253+ case Keyword . get ( meta , :counter , nil ) do
254+ nil -> ""
255+ counter ->
256+ counter
257+ |> Kernel . abs ( )
258+ |> to_string ( )
259+ end
260+ end
261+
262+ defp make_identifier ( { var , meta , _ } ) do
263+ counter = get_counter ( meta )
264+ to_string ( var ) <> counter
244265 end
245266end
0 commit comments