Index: polemy/parse.d ================================================================== --- polemy/parse.d +++ polemy/parse.d @@ -324,43 +324,38 @@ return new App(pos, new Var(pos,"if"), cond, new Fun(thenPos,[],th), new Fun(elsePos,[],el)); } 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))); return new Let(pos, pmVar, [], pmExpr, pmBody); } 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") ) { 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) ); } @@ -661,20 +656,20 @@ 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 { Index: sample/ast.pmy ================================================================== --- sample/ast.pmy +++ sample/ast.pmy @@ -1,27 +1,27 @@ def reverse(lst, acc) { case(lst) - when( {car:a, cdr: d} ) { reverse(d, {car:a, cdr:acc}) } - when( {} ) { acc } + when {car:a, cdr: d}: reverse(d, {car:a, cdr:acc}) + when {}: acc }; @macro reverseArgs(e) {@value( var ev = @macro(e); case(ev) - when( {is:"App", fun:f, args:a} ) - { + when {is:"App", fun:f, args:a}: + ( ev {args: reverse(a, {})} - } - when( _ ) - { + ) + when _ : + ( ev - } + ) )}; def main() { print( reverseArgs(1 + 2) ); print( reverseArgs(1 - 2) ); }; main()