Programming Language Sumi DEMO
match:(pattern, datum, binding) { variablep:(pattern) { (pattern instanceof String||typeof(pattern) == "string") && pattern.charAt(0) == "$" && pattern != "..." } atom:(pattern){pattern == null || typeof(pattern) == "string"|| (pattern instanceof String)} consp:(list){list instanceof Array} if (variablep(pattern)) { if (pattern in binding) { return match(binding[pattern], datum, binding); } else { binding[pattern] = datum; return binding; } } if (atom(pattern) && atom(datum)) { if (pattern+"" == datum+"") {return binding} return null } if (pattern instanceof XOX && datum instanceof XOX || pattern instanceof XOY && datum instanceof XOY) { result : match(pattern.exp1,datum.exp1,binding) if (result == null) {return null;} return match(pattern.exp2, datum.exp2, binding) } if (pattern instanceof XPXP && datum instanceof XPXP) { if (pattern.left != datum.left) {return null} if (pattern.right != datum.right) {return null} result: match(pattern.exp1,datum.exp1,binding) if (result == null) {return null} return match(pattern.exp2, datum.exp2, binding) } if (pattern instanceof PXP && datum instanceof PXP) { if (pattern.left != datum.left) {return null} if (pattern.right != datum.right) {return null} return match(pattern.exp,datum.exp,binding) } if (pattern instanceof XO && datum instanceof XO || pattern instanceof OY && datum instanceof OY) { return match(pattern.exp,datum.exp,binding) } if (consp(pattern) && consp(datum)) { result : binding for (i : 0; i < pattern.length; i++) { if (pattern[i] == "...") { return match(pattern[i + 1], datum.slice(i, datum.length), binding); } result = match(pattern[i], datum[i], binding); if (result == null) {return null} } if (datum.length > pattern.length) {return null} return result } return null } print(match(["aaa";quote($b);"$ccc"],["aaa";"bbb";["ccc";"ddd"]],{})+"\n") print(match(quote(aa + $b),quote(aa+cc*dd),{})+"\n") print(match( quote($f($arg){$body}), quote(a.b(a,b,c){a+b*d}),{} )+"\n")