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