编程的科学/Sway演示/对象/示例5
外观
这是一个使用典型 Sway 语法的 switch。
var x = 0; switch (x) { case(3) { println("greater"); } case(2) { println("equal"); } else { println("less"); } }
为了实现 *switch*,我们首先定义 *case* 函数,以防它被过滤。
function case(operand,$action,$) { list(operand,$action,$); }
请记住,过滤器依次处理每个语句,正如我们在过滤 *pop* 时所见,单行函数最适合过滤。
*switch* 的策略
- 创建一个过滤器,使 switch 表达式在范围内
- 让过滤器抛出 **success** 异常
- 将过滤器附加到 *case*
- 运行 switch 的主体,寻找成功
function switch(expr,$actions) { var result; function caseFilter(spec) { var val; if (expr == spec[0]) { throw(:success,force(spec[1])); } else if (spec[2] != :null) { throw(:success,force(spec[2][0])); } } case . filter = caseFilter; result = catch(force($actions)); if (error?(result)) { if(result . type == :success,result . value,throw(result)); } else { :null; } }