           compileList exps
         else
           [op, args...] = exps
-          fn = compileImpl op
-          if expander = trueMacros[fn]
+          opName = op.token
+          if opName and expander = trueMacros[opName]
             expander args...
+          else if opName and expander = macros[opName]
+            expander (args.map compileImpl)...
           else
-            compiledArgs = args.map compileImpl
-            if expander = macros[fn]
-              expander compiledArgs...
-            else
-              # TODO: this expandMacro doesn't make sense
-              "#{fn}(#{compiledArgs.map(expandMacro).join ', '})"
+            fn = compileImpl op
+            # TODO: this expandMacro doesn't make sense
+            "#{fn}(#{(args.map compileImpl).join ', '})"
       else if node.token.match /^"/
         node.token
       else


compileMap = (elems) ->
  [constr, args...] = elems
  "({\"#{constr.token}\": [#{args.map(compileImpl).join ', '}]})"

expandMacro = (macro) ->
  macros[macro]?() ? macro

    labelMapping word,
      ['keyword', token in keywords]
      ['numerical', /^-?\d+/.test(token)]
      #['typename', /^[A-Z]/.test token]
      ['label', /\w*:$/.test token]
      ['string', /^["']/.test token]
      ['paren', token in ['(', ')']]

