From 6753d3685448eb2ba5760de0bcc842a887d09a84 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 4 Sep 2012 00:55:13 +0200 Subject: further improvements for term rewriting macros --- compiler/patterns.nim | 31 +++++++++++-------------------- compiler/types.nim | 4 ++-- tests/patterns/targlist.nim | 9 +++++++++ tests/patterns/tor.nim | 9 +++++++++ tests/patterns/tstar.nim | 19 +++++++++++++++++++ tests/patterns/tstmtlist.nim | 18 ++++++++++++++++++ tests/run/tmemoization.nim | 2 +- tests/run/ttypedesc1.nim | 10 +++++----- 8 files changed, 74 insertions(+), 28 deletions(-) create mode 100644 tests/patterns/targlist.nim create mode 100644 tests/patterns/tor.nim create mode 100644 tests/patterns/tstar.nim create mode 100644 tests/patterns/tstmtlist.nim diff --git a/compiler/patterns.nim b/compiler/patterns.nim index ceadfe350..110fae08a 100644 --- a/compiler/patterns.nim +++ b/compiler/patterns.nim @@ -23,9 +23,6 @@ type PPatternContext = var TPatternContext proc matches(c: PPatternContext, p, n: PNode): bool -proc checkConstraints(c: PPatternContext, p, n: PNode): bool = - # XXX create a new mapping here? --> need use cases - result = matches(c, p, n) proc canonKind(n: PNode): TNodeKind = ## nodekind canonilization for pattern matching @@ -85,34 +82,28 @@ proc bindOrCheck(c: PPatternContext, param: PSym, n: PNode): bool = if pp != nil: # check if we got the same pattern (already unified): result = sameTrees(pp, n) #matches(c, pp, n) - elif checkTypes(c, param, n) and - (param.ast == nil or checkConstraints(c, param.ast, n)): + elif n.kind == nkArgList or checkTypes(c, param, n): IdNodeTablePutLazy(c.mapping, param, n) result = true proc matchStar(c: PPatternContext, p, n: PNode): bool = # match ``op*param`` - # this is quite hard: - # match against: f(a, ..., f(b, c, f(...))) - # we have different semantics if there is a choice as left operand: proc matchStarAux(c: PPatternContext, op, n, arglist: PNode) = if n.kind in nkCallKinds and matches(c, op, n.sons[0]): - for i in 1..sonsLen(n)-1: matchStarAux(c, op, n.sons[i], arglist) + for i in 1..sonsLen(n)-1: + matchStarAux(c, op, n[i], arglist) + elif n.kind == nkHiddenStdConv and n.sons[1].kind == nkBracket: + let n = n.sons[1] + for i in 0..