检查宏中的节点类型

时间:2017-09-24 16:32:16

标签: macros metaprogramming crystal-lang

来自#5028

我如何知道宏中的类型类?例如,这个:

class A
  Const = 42

  macro is_int(val)
    {% p "#{val} is int: #{val.is_a?(Int32)}" %}
  end

  is_int(Const)
end

打印false

1 个答案:

答案 0 :(得分:2)

@asterite说:

  宏中的

is_a?检查节点是否属于给定的AST node类型。

因此,您应该使用val.resolve.is_a?(NumberLiteral)代替。

加分:如果您想检查某个节点是否是某个类的后代,您可以使用val.resolve < AncestorClass(例如val.resolve < ::Enum来检查val是否为{ {1}})。