     labels.length is values.length and (allMap isLabel, labels)
 
 isSeq = (expression) ->
-  (isForm expression) and expression[0].label is 'brace'
+  (isForm expression) and expression[0].symbol is '{'
 
 isTuple = (expression) ->
-  (isForm expression) and expression[0].label is 'bracket'
+  (isForm expression) and expression[0].symbol is '['
 
 isEmptyForm = (form) ->
   (_terms form).length > 0

  ast = (astFromSource "(#{source})", -1, -1)
  [expression] = _terms ast
  {js} = compileCtxAstToJs topLevelExpression, ctx, expression
  checkTypes ctx
  (attachPrintedTypes ctx, expression)
  js: library + immutable + (listOfLines map lookupJs, setToArray toInject) + js
  ast: ast

# Primitive type checking for now
checkTypes = (ctx) ->
  # failed = mapToArray filterMap ((name) -> name is 'could not unify'), ctx.substitution
  if _notEmpty (failed = ctx.substitution.fails)
    throw new Error failed[0]

lookupJs = (moduleName) ->
  js = (lookupInMap compiledModules, moduleName)?.js

  #   map [0: "hello" 1:] {"world", "le mond", "svete"}
  # TODO: should we support bare records?
  #   [a: 2 b: 3]
  if not ctx.shouldDefer()
    form.tea = tupleOfTypes (tea for {tea} in elems)

  if ctx.assignTo()
    combinePatterns compiledElems
