首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式访问typespec的定义

以编程方式访问typespec的定义
EN

Stack Overflow用户
提问于 2017-01-19 21:26:08
回答 1查看 128关注 0票数 2

如何在我的代码中访问typespec的定义?我希望在宏中使用它来执行一些代码生成。

像这样的东西将是理想的。

给定此模块和类型and:

代码语言:javascript
复制
defmodule MyMod do
  @type t :: :ok | :error
end

我可以调用像Code.get_type(MyMod, :t)这样的函数,它将返回定义表达式的AST:

代码语言:javascript
复制
{:::, [], [{:my_type, [], Elixir}, {:|, [], [:ok, :error]}]}

或者只使用类型的AST:

代码语言:javascript
复制
{:|, [], [:ok, :error]}
EN

回答 1

Stack Overflow用户

发布于 2017-01-19 22:11:24

这是一个hack (并且只在编译阶段有效),但是它可以做你想要的:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41742937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档