Case 语句宏

名为 `` case `` 的宏能够为特定类型实现 case 语句。 下面的例子借助元组已有的相等运算符(由 system.== 提供)为它们实现了 case 语句。

  1. import std/macros
  2. macro `case`(n: tuple): untyped =
  3. result = newTree(nnkIfStmt)
  4. let selector = n[0]
  5. for i in 1 ..< n.len:
  6. let it = n[i]
  7. case it.kind
  8. of nnkElse, nnkElifBranch, nnkElifExpr, nnkElseExpr:
  9. result.add it
  10. of nnkOfBranch:
  11. for j in 0..it.len-2:
  12. let cond = newCall("==", selector, it[j])
  13. result.add newTree(nnkElifBranch, cond, it[^1])
  14. else:
  15. error "自定义的元组 'case' 无法处理这个节点", it
  16. case ("foo", 78)
  17. of ("foo", 78): echo "yes"
  18. of ("bar", 88): echo "no"
  19. else: discard

重载解析会处理 case 宏: case 宏的第一个参数的类型用来匹配 case 语句选择器表达式的类型。 然后整个 case 语句被填入这个参数并对宏求值。

换句话说,这种宏需要转换整个 case 语句,但是决定调用哪个宏的仅是语句的选择器表达式。