问题
乍一看,如果没有一些严重的错误,宏就无法正确嵌套。
主要问题是从数据对象中检索宏的值会将这个值嵌套到一个列表中:
a[X] -> $X {% id %}
main -> a["test"] {% id %}
Parse results:
[ [ 'test' ] ]
预期的结果是[ 'test' ]
。
一个快速的解决方法是返回 data[0][0],但这还不够,因为结果会嵌套在宏的每一层:
a[X] -> b[$X] {% id %}
b[X] -> $X {% id %}
main -> a["test"] {% id %}
Parse results:
[ [ [ 'x' ] ] ]
为了修复我们可以data => data[0][0]
用于每个宏的错误。然而,这绝对是丑陋的。
真正的解决方法是使用动态范围。由于我们不能(据我所知)创建没有参数的宏,让我们使用无用的参数:
a[X] -> b["_"] {% id %}
b[_] -> $X {% id %}
main -> a["test"] {% id %}
Parse results:
[ [ 'test' ] ]
这停止了之前发生的嵌套地狱——我们可以通过 500 个子宏并且仍然得到相同的结果。但是我们仍然需要为最终的 sub-macro 放置 data[0][0] b
,这会阻止我们b
单独使用宏 - 我们必须使用a
它才能工作。
我们正在寻找一种解决方案: - 允许单独使用最后一个宏 - 避免使用 data => data[0][0]