elixir - 如何为包含特殊字符的函数编写规范?

标签 elixir typespec

我有一些定义具有特殊字符的函数的宏。特别是“:”和“。”。是否可以为其中包含这些字符的函数编写规范定义?

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

有没有办法转义函数规范中的字符,以便在不删除规范的情况下进行编译?我可以将“:”更改为“_”或除“。”之外表现更好的其他内容。基本上是没有商量余地的。

最佳答案

你能在你的宏中指定typespec吗?如果是这样,这似乎工作正常:

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

我觉得将类型规范与定义捆绑在一起最有意义;够了吗?

编辑:看起来这也行,虽然有点乱:

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

关于elixir - 如何为包含特殊字符的函数编写规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62421400/

相关文章:

erlang - 如何启动特定的发布版本?

Elixir phoenix 注销链接无效

返回随机值的函数的 Elixir doctest 失败

pattern-matching - 模式匹配中 byte_size 的语法是什么?

elixir - 如何在 Elixir 字符串中显示单个反斜杠

c++ - 您能告诉我为什么出现此错误吗?它涉及到函数指针

elixir - 如何通过 iex 显示命名函数的类型规范

types - Elixir:为map指定 `key_type`,其中 `key_type`是枚举类型