带有类型参数异常的宏

我可以在方法中使用类型化参数:

def my_method(val1, val2 : String? = nil)
  # something
end

但我不能在 macrocrystal play example)做同样的事情

macro my_macro(val1, v22 : String?)
  puts {{val1}}
  puts {{v22}}
end

我有例外

Syntax error in eval:1: unexpected token: : (expected ',' or ')')

是否可以在 macro 中使用预定义类型?

我需要这样的东西:

macro my_macro(val1, val2_key val2 : String? = nil)
  # do
end

谢谢!

回答(1)

2 years ago

首先,宏中使用的类型与普通代码中的类型不同,例如,当您执行 some_macro "a string" 时,在编译时 "a string" 的类型是 StringLiteral .

其次,目前不可能对宏的论点进行限制..

你唯一能做的就是删除类型限制,并在开头添加一个if语句来检查参数的类型,如:

macro foo(arg = nil)
  {% unless arg.is_a? StringLiteral || arg.is_a? NilLiteral %}
    {% raise "arg must be a string or nil !" %}
  {% end %}
end

如果你想要这个功能,你可以在Github上的问题跟踪器上打开一个问题,我认为还没有 .