 
 compileImpl = (node, hoistableWheres = []) ->
   # For now special case match to allow definition hoisting up one level
-  if Array.isArray(node) and node.length > 2
+  if matchNode 'match', node
     [op, args...] = inside node
-    if op.type is 'operator' and op.token is 'match'
-      return trueMacros[op.token] hoistableWheres, args...
+    return trueMacros[op.token] hoistableWheres, args...
 
   switch node.type
     when 'comment' then 'null'

      [op, args...] = inside pattern
      args.map labelNames
  else
    pattern.label = 'name' unless pattern.label

labelWhere = (wheres) ->
  for [name, def] in wheres

labelParams = (ast, params) ->
  paramNames = (token for {token} in params)
  mapTokens paramNames, ast, (word) ->
    word.label = 'param' if isReference word

labelRecursiveCall = (ast, fnname) ->
  mapTokens [fnname], ast, (word) ->
