Как мне написать spe c для функции, содержащей специальные символы? - PullRequest
3 голосов
/ 17 июня 2020

У меня есть несколько макросов, определяющих функции со специальными символами. В частности ":" и ".". Можно ли написать определение spe c для функций с этими символами в нем?

defmodule UniqueCharacters do
  defmacro make_wild_function_name do
    function_name = String.to_atom("baz:foo.bar")
    quote do
      def unquote(function_name)(), do: :ok
    end
  end
end

defmodule TestSpec do
  import UniqueCharacters

  #This next line doesn't work
  @spec baz:foo.bar() :: :ok
  make_wild_function_name()
end

Это приводит к следующей ошибке:

** (SyntaxError) lib/unique_characters.ex:14: keyword argument must be followed by space after: baz:

    (elixir) lib/kernel/parallel_compiler.ex:229: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/7

Есть ли способ избежать символы в функции spe c, так что это будет компилироваться без удаления spe c? Я могу изменить ":" на "_" или что-нибудь более корректное, кроме "." в основном не подлежит обсуждению.

1 Ответ

3 голосов
/ 17 июня 2020

Можете ли вы указать тип c в макросе? Если так, похоже, это работает нормально:

defmodule UniqueCharacters do
  defmacro make_wild_function_name do
    function_name = String.to_atom("baz:foo.bar")
    quote do
      @spec unquote(function_name)() :: :ok
      def unquote(function_name)(), do: :ok
    end
  end
end

defmodule TestSpec do
  import UniqueCharacters

  make_wild_function_name()
end

Мне кажется, что объединение typepe c с определением имеет наибольший смысл; этого достаточно?

Редактировать: Похоже, это тоже работает, хотя и неаккуратно:

defmodule UniqueCharacters do
  defmacro make_wild_function_name do
    function_name = String.to_atom("baz:foo.bar")
    quote do
      def unquote(function_name)(), do: :ok
    end
  end
end

defmodule TestSpec do
  import UniqueCharacters

  @spec unquote(:'baz:foo.bar')() :: :ok
  make_wild_function_name()
end
...