Case 语句宏
名为 `` case `` 的宏能够为特定类型实现 case 语句。 下面的例子借助元组已有的相等运算符(由 system.== 提供)为它们实现了 case 语句。
import std/macros
macro `case`(n: tuple): untyped =
result = newTree(nnkIfStmt)
let selector = n[0]
for i in 1 ..< n.len:
let it = n[i]
case it.kind
of nnkElse, nnkElifBranch, nnkElifExpr, nnkElseExpr:
result.add it
of nnkOfBranch:
for j in 0..it.len-2:
let cond = newCall("==", selector, it[j])
result.add newTree(nnkElifBranch, cond, it[^1])
else:
error "自定义的元组 'case' 无法处理这个节点", it
case ("foo", 78)
of ("foo", 78): echo "yes"
of ("bar", 88): echo "no"
else: discard
重载解析会处理 case 宏: case 宏的第一个参数的类型用来匹配 case 语句选择器表达式的类型。 然后整个 case 语句被填入这个参数并对宏求值。
换句话说,这种宏需要转换整个 case 语句,但是决定调用哪个宏的仅是语句的选择器表达式。
当前内容版权归 vectorworkshopbaoerjie 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 vectorworkshopbaoerjie .