       atom.label = 'name'
       id = (ctx.definitionId()) ? (ctx.declarationId symbol) ? ctx.freshId()
       type = toConstrained ctx.freshTypeVariable star
-      ctx.bindTypeVariables [type.type.name]
+      # ctx.bindTypeVariables [type.type.name]
       ctx.addToDefinedNames {name: symbol, id: id, type: type}
       type: type
       id: id

        throw new Error "Error when deferring #{name} #{e.message}"
      if _notEmpty retainedConstraints
        ctx.extendSubstitution substituionFail "#{name}'s context is too weak, missing #{listOf (map printType, retainedConstraints)}"
        console.log "unfiied", map printType, unifiedType.constraints
        console.log "checked", map printType, checked
        console.log "not declared", (map printType, notDeclared)
        # console.log "reduced checked", map printType, substituteList ctx.substitution, reduceConstraints ctx, checked
        console.log name,
          "declared", (map printType, (substituteList ctx.substitution, unifiedType.constraints))
          "inferred", (map printType, (substituteList ctx.substitution, constraints))
          "not declared", (map printType, (substituteList ctx.substitution, notDeclared))
          "retaineed", (map printType, retainedConstraints)
          
  else
    [deferredConstraints, retainedConstraints] = deferConstraints ctx,
      ctx.allBoundTypeVariables(),

      (substituteList ctx.substitution, constraints)
    # Finalizing type again after possibly added substitution when defer constraints
    currentType = substitute ctx.substitution, type
    # log "assign type", name, (printType (addConstraints currentType, retainedConstraints)), (printType quantifyUnbound ctx, (addConstraints currentType, retainedConstraints))
    ctx.assignType name,
      if polymorphic
        quantifyUnbound ctx, (addConstraints currentType, retainedConstraints)
