@@ -325,14 +325,12 @@ } AST parsePatternMatch(LexPosition pos) { - // case "(" pmExpr ")" CASES + // case pmExpr CASES //==> // let pmVar = pmExpr in (... let pmTryFirst = ... in pmTryFirst()) - eat("(", "after case"); AST pmExpr = E(0); - eat(")", "after case"); string pmVar = freshVarName(); string pmTryFirst = freshVarName(); AST pmBody = parsePatternMatchCases(pmVar, pmTryFirst, new App(pos, new Var(pos, pmTryFirst))); @@ -340,9 +338,9 @@ } AST parsePatternMatchCases(string pmVar, string tryThisBranchVar, AST thenDoThis) { - // when( pat ) { cBody } + // when pat: cBody //==> // ... let failBranchVar = ... in // let tryThisBranchVar = fun(){ if(test){cBody}else{failBranchVar()} } in thenDoThis if( tryEat("when") ) @@ -349,17 +347,14 @@ { auto pos = currentPosition(); string failBranchVar = freshVarName(); - eat("(", "after when"); auto pr = parsePattern(); - eat(")", "after when"); - eat("{", "after pattern"); - AST cBody = Body(); + eat(":", "after when pattern"); + AST cBody = E(0); AST judgement = new App(pos, new Var(pos, "if"), ppTest(pmVar, pr), new Fun(pos,[],ppBind(pmVar, pr, cBody)), new Var(pos, failBranchVar)); - eat("}", "after pattern clause"); return parsePatternMatchCases(pmVar, failBranchVar, new Let(pos, tryThisBranchVar, [], new Fun(pos,[],judgement), thenDoThis) ); @@ -662,18 +657,18 @@ unittest { assert_nothrow(parseString(` case( 1 ) - when(x){1} + when(x): 1 `)); assert_nothrow(parseString(` - case( 1 ) - when({aaaa:_}){1} + case 1 + when {aaaa:_}: 1 `)); assert_nothrow(parseString(` - case( 1 ) - when({aaaa:@value(x)}){1} - when({aaaa:{bbb:_}, ccc:123}){1} + case 1 + when {aaaa:@value(x)}: 1 + when {aaaa:{bbb:_}, ccc:123}: 1 `)); } unittest