   [constr, args...] = elems
   items = args.map(compileImpl).join ', '
   "({\"#{constr.token}\": [#{items}]})"
+
+compileConst = (token) ->
+  "({'#{token.token}': true})"
 
 compileList = (elems) ->
   # "[#{elems.join ', '}]"

  #       [tail, "#{exp}.tail"]
  #     ]
  (pattern) ->
    if not Array.isArray pattern
      throw new Error "pattern match expected pattern but saw token #{pattern.token}"
    elems = inside pattern
    hasSplat = no
    requiredElems = 0
    for elem in elems
      if isSplat elem
        hasSplat = yes
      else
        requiredElems++
    trigger: not isMap pattern
    cache: true
    cond: (exp) -> ["$sequenceSize(#{exp}) #{if hasSplat then '>=' else '=='} #{requiredElems}"]
    assignTo: (exp) ->
      recurse: (for elem, i in elems
        if isSplat elem
          [elem, "$sequenceSplat(#{i}, #{elems.length - i - 1}, #{exp})"]
        else
          [elem, "$sequenceAt(#{i}, #{exp})"])
  (pattern) ->
    [constr, elems...] = inside pattern
    label = "'#{constr.token}'"
    trigger: isMap pattern
    cache: true
    cacheMore: (exp) -> if elems.length > 1 then ["#{exp}[#{label}]"] else []

        exps = inside node
        if isMap node
          compileMap exps
        else if isTuple(node) or isList(node)
          compileList exps
        else
          [op, args...] = exps
