diff --git a/lib/elixir/lib/code.ex b/lib/elixir/lib/code.ex index 730e0bc5fa..e1c7a971f0 100644 --- a/lib/elixir/lib/code.ex +++ b/lib/elixir/lib/code.ex @@ -306,21 +306,33 @@ defmodule Code do ## Examples - iex> Code.eval_string("a + b", [a: 1, b: 2], file: __ENV__.file, line: __ENV__.line) - {3, [a: 1, b: 2]} + iex> {result, binding} = Code.eval_string("a + b", [a: 1, b: 2], file: __ENV__.file, line: __ENV__.line) + iex> result + 3 + iex> Enum.sort(binding) + [a: 1, b: 2] - iex> Code.eval_string("c = a + b", [a: 1, b: 2], __ENV__) - {3, [a: 1, b: 2, c: 3]} + iex> {result, binding} = Code.eval_string("c = a + b", [a: 1, b: 2], __ENV__) + iex> result + 3 + iex> Enum.sort(binding) + [a: 1, b: 2, c: 3] - iex> Code.eval_string("a = a + b", [a: 1, b: 2]) - {3, [a: 3, b: 2]} + iex> {result, binding} = Code.eval_string("a = a + b", [a: 1, b: 2]) + iex> result + 3 + iex> Enum.sort(binding) + [a: 3, b: 2] For convenience, you can pass `__ENV__/0` as the `opts` argument and all imports, requires and aliases defined in the current environment will be automatically carried over: - iex> Code.eval_string("a + b", [a: 1, b: 2], __ENV__) - {3, [a: 1, b: 2]} + iex> {result, binding} = Code.eval_string("a + b", [a: 1, b: 2], __ENV__) + iex> result + 3 + iex> Enum.sort(binding) + [a: 1, b: 2] """ @spec eval_string(List.Chars.t(), binding, Macro.Env.t() | keyword) :: {term, binding} @@ -679,15 +691,21 @@ defmodule Code do ## Examples iex> contents = quote(do: var!(a) + var!(b)) - iex> Code.eval_quoted(contents, [a: 1, b: 2], file: __ENV__.file, line: __ENV__.line) - {3, [a: 1, b: 2]} + iex> {result, binding} = Code.eval_quoted(contents, [a: 1, b: 2], file: __ENV__.file, line: __ENV__.line) + iex> result + 3 + iex> Enum.sort(binding) + [a: 1, b: 2] For convenience, you can pass `__ENV__/0` as the `opts` argument and all options will be automatically extracted from the current environment: iex> contents = quote(do: var!(a) + var!(b)) - iex> Code.eval_quoted(contents, [a: 1, b: 2], __ENV__) - {3, [a: 1, b: 2]} + iex> {result, binding} = Code.eval_quoted(contents, [a: 1, b: 2], __ENV__) + iex> result + 3 + iex> Enum.sort(binding) + [a: 1, b: 2] """ @spec eval_quoted(Macro.t(), binding, Macro.Env.t() | keyword) :: {term, binding} diff --git a/lib/elixir/src/elixir_erl_var.erl b/lib/elixir/src/elixir_erl_var.erl index 245ea04b51..efabe4a0a4 100644 --- a/lib/elixir/src/elixir_erl_var.erl +++ b/lib/elixir/src/elixir_erl_var.erl @@ -72,7 +72,7 @@ dump_binding(Binding, #{current_vars := {ExVars, _}}, #elixir_erl{var_names=ErlV ErlName = maps:get(Version, ErlVars), Value = find_binding(ErlName, Binding), - orddict:store(Key, Value, Acc); + [{Key, Value} | Acc]; (_, _, Acc) -> Acc end, [], ExVars). diff --git a/lib/elixir/test/erlang/function_test.erl b/lib/elixir/test/erlang/function_test.erl index 6f9175848e..e0a8c89c50 100644 --- a/lib/elixir/test/erlang/function_test.erl +++ b/lib/elixir/test/erlang/function_test.erl @@ -4,7 +4,7 @@ eval(Content) -> {Value, Binding, _} = elixir:eval_forms(elixir:'string_to_quoted!'(Content, 1, 1, <<"nofile">>, []), [], []), - {Value, Binding}. + {Value, lists:sort(Binding)}. function_arg_do_end_test() -> {3, _} = eval("if true do\n1 + 2\nend"),