如何在我的代码中访问typespec的定义?我希望在宏中使用它来执行一些代码生成。
像这样的东西将是理想的。
给定此模块和类型and:
defmodule MyMod do
@type t :: :ok | :error
end我可以调用像Code.get_type(MyMod, :t)这样的函数,它将返回定义表达式的AST:
{:::, [], [{:my_type, [], Elixir}, {:|, [], [:ok, :error]}]}或者只使用类型的AST:
{:|, [], [:ok, :error]}发布于 2017-01-19 22:11:24
这是一个hack (并且只在编译阶段有效),但是它可以做你想要的:
defmodule MyMod do
@type t1 :: :ok | :error
@type t2 :: :done
@type_defs Module.get_attribute(__MODULE__, :type, [])
def type_defs,
do: Enum.map(@type_defs, fn {:type, type, _} -> type end)
end
MyMod.type_defs
#⇒ [{:::, [line: 9], [{:t2, [line: 9], nil}, :done]},
# {:::, [line: 8], [{:t1, [line: 8], nil}, {:|, [line: 8], [:ok, :error]}]}]你可以用defmacro __using__声明一个模块,在需要的时候实现这个功能和use TypeExtractor。
https://stackoverflow.com/questions/41742937
复制相似问题