带有类型参数异常的宏

时间:2018-01-31 07:00:48

标签: crystal-lang

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

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

THX!

1 个答案:

答案 0 :(得分:3)

首先,宏中使用的类型与普通代码中的类型不同,例如,当您执行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上的问题跟踪器上打开一个问题,我认为还没有。