[英]Programatically accessing the definition of typespec
如何在我的代碼中訪問類型規范的定義? 我希望在宏中使用它來執行一些代碼生成。
這樣的事情將是理想的。
鑒於此模塊和類型規范:
defmodule MyMod do
@type t :: :ok | :error
end
我可以調用諸如Code.get_type(MyMod, :t)
類的函數,它會返回定義表達式的 AST:
{:::, [], [{:my_type, [], Elixir}, {:|, [], [:ok, :error]}]}
或者只是類型的 AST:
{:|, [], [:ok, :error]}
這是一個 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.