Skip to content

Commit 14acbaa

Browse files
committed
Updated to use immutable List class
1 parent 1ce96dd commit 14acbaa

14 files changed

Lines changed: 264 additions & 232 deletions

File tree

lib/elixir_script/translator/control.ex

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,31 @@ defmodule ElixirScript.Translator.Control do
132132
elements = [value_one, value_two]
133133
make_tuple_for(elements, enum, generators)
134134
{:{}, _, elements} ->
135-
make_tuple_for(elements, enum, generators)
135+
make_tuple_for(elements, enum, generators)
136136
_ ->
137137
i = Translator.translate(identifier)
138138
variable_declarator = Builder.variable_declarator(i)
139139
variable_declaration = Builder.variable_declaration([variable_declarator], :let)
140140

141-
Builder.for_of_statement(
142-
variable_declaration,
143-
Translator.translate(enum),
144-
Builder.block_statement(List.wrap(handle_generators(tl(generators))))
145-
)
141+
if !is_binary(enum) do
142+
Builder.for_of_statement(
143+
variable_declaration,
144+
Builder.call_expression(
145+
Builder.member_expression(
146+
Translator.translate(enum),
147+
Builder.identifier(:value)
148+
),
149+
[]
150+
),
151+
Builder.block_statement(List.wrap(handle_generators(tl(generators))))
152+
)
153+
else
154+
Builder.for_of_statement(
155+
variable_declaration,
156+
Translator.translate(enum),
157+
Builder.block_statement(List.wrap(handle_generators(tl(generators))))
158+
)
159+
end
146160
end
147161
[into: _expression] ->
148162
raise ElixirScript.UnsupportedError, :into
@@ -279,15 +293,21 @@ defmodule ElixirScript.Translator.Control do
279293
end
280294

281295
defp build_push_ast(param) do
296+
282297
Builder.expression_statement(
283-
Builder.call_expression(
284-
Builder.member_expression(
285-
Builder.identifier("_results"),
286-
Builder.identifier("push")
287-
),
288-
[param]
298+
Builder.assignment_expression(
299+
:=,
300+
Builder.identifier(:_results),
301+
Builder.call_expression(
302+
Builder.member_expression(
303+
Builder.identifier("List"),
304+
Builder.identifier("append")
305+
),
306+
[Builder.identifier(:_results), param]
307+
)
289308
)
290309
)
310+
291311
end
292312

293313

lib/elixir_script/translator/pattern_matching.ex

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,23 @@ defmodule ElixirScript.Translator.PatternMatching do
2020
Utils.make_throw_statement("MatchError", "no match of right hand side value")
2121
)
2222
_ ->
23-
declarator = Builder.variable_declarator(
24-
Translator.translate(left),
25-
Translator.translate(right)
26-
)
23+
declarator = case is_list(left) do
24+
true ->
25+
array = left
26+
|> Enum.map(&Translator.translate(&1))
27+
|> Builder.array_expression
28+
29+
Builder.variable_declarator(
30+
array,
31+
Translator.translate(right)
32+
)
33+
34+
false ->
35+
Builder.variable_declarator(
36+
Translator.translate(left),
37+
Translator.translate(right)
38+
)
39+
end
2740

2841
Builder.variable_declaration([declarator], :let)
2942
end
@@ -114,6 +127,8 @@ defmodule ElixirScript.Translator.PatternMatching do
114127
case Translator.translate(value) do
115128
%ESTree.Identifier{} ->
116129
true
130+
%ESTree.CallExpression{ callee: %ESTree.Identifier{ name: "List" } } ->
131+
false
117132
%ESTree.CallExpression{} ->
118133
true
119134
_ ->
@@ -133,6 +148,8 @@ defmodule ElixirScript.Translator.PatternMatching do
133148
case Translator.translate(value) do
134149
%ESTree.Identifier{} ->
135150
{key, {:__aliases__, [], [:undefined]} }
151+
%ESTree.CallExpression{ callee: %ESTree.Identifier{ name: "List" } } ->
152+
{key, value}
136153
%ESTree.CallExpression{} ->
137154
{key, hd(process_pattern(value)) }
138155
_ ->
@@ -251,18 +268,8 @@ defmodule ElixirScript.Translator.PatternMatching do
251268
{ :identifier, item } ->
252269

253270

254-
declarator = case type do
255-
:list ->
256-
Builder.variable_declarator(
257-
Builder.identifier(item),
258-
Builder.member_expression(
259-
identifier_fn.(index),
260-
Builder.literal(current_state.state_index),
261-
true
262-
)
263-
)
264-
:tuple ->
265-
Builder.variable_declarator(
271+
272+
declarator = Builder.variable_declarator(
266273
Builder.identifier(item),
267274
Builder.call_expression(
268275
Builder.member_expression(
@@ -272,30 +279,19 @@ defmodule ElixirScript.Translator.PatternMatching do
272279
[Builder.literal(current_state.state_index)]
273280
)
274281
)
275-
end
276-
277282
declaration = Builder.variable_declaration([declarator], :let)
278283

279284
{declaration, %{current_state | body: current_state.body, state_index: current_state.state_index + 1 }}
280285
params ->
281286
{new_body, _params} = build_pattern_matched_body(current_state.body, [params],
282287
fn(new_index) ->
283-
case type do
284-
:list ->
285-
Builder.member_expression(
286-
identifier_fn.(index),
287-
Builder.literal(current_state.state_index + new_index),
288-
true
289-
)
290-
:tuple ->
291-
Builder.call_expression(
292-
Builder.member_expression(
293-
identifier_fn.(index),
294-
Builder.identifier(:get)
295-
),
296-
[Builder.literal(current_state.state_index + new_index)]
297-
)
298-
end
288+
Builder.call_expression(
289+
Builder.member_expression(
290+
identifier_fn.(index),
291+
Builder.identifier(:get)
292+
),
293+
[Builder.literal(current_state.state_index + new_index)]
294+
)
299295
end, nil)
300296

301297
{nil, %{current_state | body: new_body, state_index: current_state.state_index + 1 }}
@@ -459,7 +455,7 @@ defmodule ElixirScript.Translator.PatternMatching do
459455
build_member_expression_tree(keys, identifier)
460456
)
461457

462-
Builder.variable_declaration([declarator], :let)
458+
Builder.variable_declaration([declarator], :let)
463459
{key, {:identifier, value} }->
464460
declarator = Builder.variable_declarator(
465461
Builder.identifier(value),

lib/elixir_script/translator/primitive.ex

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,14 @@ defmodule ElixirScript.Translator.Primitive do
3434
end
3535

3636
defp make_array_expression(elements) do
37-
elements
38-
|> Enum.map(&Translator.translate(&1))
39-
|> Builder.array_expression
37+
#elements
38+
#|> Enum.map(&Translator.translate(&1))
39+
#|> Builder.array_expression
40+
41+
Builder.call_expression(
42+
Builder.identifier("List"),
43+
Enum.map(elements, fn(x) -> Translator.translate(x) end)
44+
)
4045
end
4146

4247
def make_interpolated_string(elements) do

priv/alphonse/lib/atom.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
//TODO: evaluate using Symbol here (i.e Symbol.for("atomName"))
2+
// this would rid the need of using a custom Atom object
3+
14
let Atom;
25

36
Atom = function(_value){
@@ -13,6 +16,11 @@ Atom = function(_value){
1316
Atom.__MODULE__ = Atom("Atom");
1417

1518
Atom.to_string = function (atom) {
19+
//let atomString = atom.toString();
20+
//let indexOfOpenParen = atomString.indexOf("(");
21+
//let indexOfCloseParen = atomString.lastIndexOf(")");
22+
//return atomString.substring(indexOfOpenParen+1, indexOfCloseParen);
23+
1624
return atom.toString();
1725
};
1826

priv/alphonse/lib/kernel.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ let Kernel = {
4545
},
4646

4747
is_list: function(x){
48-
return x instanceof Array;
48+
return x instanceof List;
4949
},
5050

5151
is_map: function(x){
@@ -61,6 +61,10 @@ let Kernel = {
6161
},
6262

6363
length: function(x){
64+
if(Kernel.is_list(x) || Kernel.is_tuple(x)){
65+
return x.length();
66+
}
67+
6468
return x.length;
6569
},
6670

0 commit comments

Comments
 (0)