Environment
- Elixir & Erlang/OTP versions (elixir --version):
Erlang/OTP 23 [erts-11.0.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]
Elixir 1.10.4 (compiled with Erlang/OTP 23)
- Operating system:
macOS Catalina 10.15.6
Current behavior
Compiler complains with this message:
== Compilation error in file lib/problem1.ex ==
** (ArgumentError) argument error
(stdlib 3.13) :lists.keyfind(:counter, 1, :b)
(elixir 1.10.4) src/elixir_utils.erl:45: :elixir_utils.var_context/2
(stdlib 3.13) lists.erl:1354: :lists.mapfoldl/3
for this code:
`
defmodule Problem1 do
def sample,
do: {
:fname,
{:a, :cmd,
[
{:a, :b, :reqres},
{:a, :c, :req},
]}
}
defmacro res_cmd() do
{fnname, {namespace,container,lista}} = sample()
quote do
def unquote(fnname)(:res, pars) do
{
unquote(namespace),
unquote(container),
unquote(lista)
|> Enum.filter(fn {_, _, ty} -> ty == :res or ty == :reqres end)
|> Enum.map(fn {a,b,_c} -> { a, b, pars[b]} end)
}
end
end
end
end
defmodule Injected1 do
require Problem1
Problem1.res_cmd()
end
`
Expected behavior
As this version of the code. It works as desired defining a function in module Injected2:
`
defmodule Problem2 do
def sample,
do: {
:fname,
{:a, :cmd,
[
{:a, :b, :reqres},
{:a, :c, :req},
]}
}
defmacro res_cmd() do
{fnname, {namespace,container,lista}} = sample()
filtered = lista
|> Enum.filter(fn {_, _, ty} -> ty == :res or ty == :reqres end)
|> Enum.map(fn {a,b,_c} -> {a,b} end)
quote do
def unquote(fnname)(:res, pars) do
{
unquote(namespace),
unquote(container),
unquote(filtered)
|> Enum.map(fn {a,b} -> { a, b, pars[b]} end)
}
end
end
end
end
defmodule Injected2 do
require Problem2
Problem2.res_cmd()
end
`
Environment
Erlang/OTP 23 [erts-11.0.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]
Elixir 1.10.4 (compiled with Erlang/OTP 23)
macOS Catalina 10.15.6
Current behavior
Compiler complains with this message:
== Compilation error in file lib/problem1.ex ==
** (ArgumentError) argument error
(stdlib 3.13) :lists.keyfind(:counter, 1, :b)
(elixir 1.10.4) src/elixir_utils.erl:45: :elixir_utils.var_context/2
(stdlib 3.13) lists.erl:1354: :lists.mapfoldl/3
for this code:
`
defmodule Problem1 do
def sample,
do: {
:fname,
{:a, :cmd,
[
{:a, :b, :reqres},
{:a, :c, :req},
]}
}
end
defmodule Injected1 do
require Problem1
Problem1.res_cmd()
end
`
Expected behavior
As this version of the code. It works as desired defining a function in module Injected2:
`
defmodule Problem2 do
def sample,
do: {
:fname,
{:a, :cmd,
[
{:a, :b, :reqres},
{:a, :c, :req},
]}
}
end
defmodule Injected2 do
require Problem2
Problem2.res_cmd()
end
`