Skip to content

Compile error for function definition via macro #10308

Description

@Nazari

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
`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions