如何查看在编译时宏中是否定义了常量/ TypeNode?

时间:2018-02-13 06:39:48

标签: crystal-lang

是否可以通过使用宏来检查是否已定义全局常量(例如,类,结构,模块的TypeNode)?

{% if defined?(::My_Class) %}
  puts "My_Class has been defined."
{% end %}

我知道可以使用TypeNode#has_constant?,但问题是必须在全局命名空间中定义一个常量。

(我问的原因是因为在开发和重构期间,我发现在一些情况下这将是一个方便的占位符,直到我可以重新编写其余的代码库。)

2 个答案:

答案 0 :(得分:5)

您可以编写一个模拟该功能的宏。 使用TypeNode#resolve?检查是否已定义常量,然后有条件地插入要执行的代码:

macro if_defined(path, &blok)
  {% if path.resolve? %}
    {{blok.body}}
  {% else %}
    puts "Not defined: {{path.id}} "
  {% end %}
end # === macro if_defined

if_defined(Kemal::Session::My_Constant) do
  Kemal.listen
end

答案 1 :(得分:3)

在顶级范围中,宏变量@type指的是程序。您可以使用@type.has_constant?(:Foo)来确定是否定义了顶级常量Foo