Crystal lang : 宏中的 `block_given`?

Crystal lang : `block_given` in Macro?

我想要一种方法来检测是否为宏提供了一个块,宏的行为取决于此。

对于方法,我可以定义两种方法来处理不同的情况,一种显式带有 block 参数,另一种则没有。编译器将按预期调用正确的方法。

但对于宏,我发现编译器并不关心块参数的多态性——只要给出块,它总是调用第一个宏。

我不确定我是否理解正确,但也许简单的检查对您有帮助?

macro name(*args, &block)
  {% if block %}
    puts "with block"
  {% else %}
    puts "without block"
  {% end %}
end

name do
  "1"
end
#=> with block

name("1")
#=> without block

https://carc.in/#/r/53yy