为什么案例宏没有嵌套?

时间:2014-10-23 19:13:51

标签: sweet.js

鉴于此sweet.js宏

macro m {
    case { _ ( $a, $b ) } => {
        return #{$a + $b};
    }
    case { _ ( $a ) } => {
        return #{$a};
    }
    case { _ } => {
        return #{no};
    }
}

export m;

这个源代码:

m(1, [m(2)]);
m(1, m(2));

如何创建一个产生此输出的案例:

1 + [2];
1 + 2;

而不是这个?

1 + [2];
no(1, 2);

P.S。实际用例需要大小写宏,而不是规则宏。

1 个答案:

答案 0 :(得分:2)

你在这里遇到的基本问题是模式变量 只匹配一个令牌,因此m(1, m(2))模式$b得到 绑定到m而不是m(2)。这是因为内部m宏没有 在外部m宏运行之前进行扩展。

解决此问题的最简单方法是使用...

macro m {
    case { _ ( $a ..., $b ...) } => {
    return #{$a ... + $b ...};
    }
    case { _ ( $a ... ) } => {
    return #{$a ...};
    }
    case { _ } => {
    return #{no};
    }
}