     currentType = substitute ctx.substitution, type
     deps = ctx.deferredNames()
     if deps.length > 0
-      # log "adding top level lhs to deferred #{name}"
+      # log "adding top level lhs to deferred #{name}", deps
       ctx.addToDeferred {name, type, deps: (map (({name}) -> name), deps)}
       for dep in deps
         ctx.addToDeferred {name: dep.name, type: dep.type, deps: [name]}

    # expressionCompile ctx, arrayToConses elems
    # result =>         "[#{listOf map _compiled, elems}]"

    elemType = ctx.freshTypeVariable star
    compiledElems = termsCompile ctx, elems
    for elem in elems
      unify ctx, elemType, elem.tea.type

    form.label = 'operator'
    form.tea = new Constrained (concatMap _constraints, (tea for {tea} in elems)),
      new TypeApp arrayType, elemType
    assignCompile ctx, form, (jsArray compiledElems)

isSplat = (expression) ->
  (isAtom expression) and (_symbol expression)[...2] is '..'

star = '*'
arrowType = new TypeConstr 'Fn', kindFn 2
arrayType = new TypeConstr 'Array', kindFn 1
hashmapType = new TypeConstr 'Map', kindFn 2
hashsetType = new TypeConstr 'Set', kindFn 1
stringType = typeConstant 'String'

safePrintType = (type) ->
  try
