Crystal lang:在宏中,最佳做法是将参数添加到“调用”节点

时间:2018-07-26 06:41:22

标签: macros crystal-lang

Call#args的类型为ArrayLiteral,但是ArrayLiteral没有任何插入元素的方法。所以我的问题是如何在优雅地调用中添加一个参数。

我只知道这种愚蠢的方式:

macro method_missing(call)
    Delegator.{{call.name}}("a new parameter", {{call.args}}) {{call.block}}
end

但是很难处理#named_arg,尤其是#splat_index(尽管它是Block的成员,这里也有相同的问题)

是否存在更好的方法,或者它是编译器开发人员的待办事项?

1 个答案:

答案 0 :(得分:1)

ArrayLiteral实际上可以被修改,它提供了几种添加元素的方法:#<<#[]=#push#unshift

没有文字#insert,但似乎您不是在明确地寻找它。它可能会添加到宏解释器中。但也可以使用#select#<<来实现。