def append(other)
      # raise Erlang::ImproperListError if improper?
      other = Erlang.from(other)
      return self if not improper? and Erlang.is_list(other) and other.empty?
      return other if Erlang.is_list(other) and empty?
      is_improper = Erlang.is_list(other) ? other.improper? : true
      out = tail = Erlang::Cons.allocate
      list = self
      until list.empty?
        new_node = Erlang::Cons.allocate
        new_node.instance_variable_set(:@head, list.head)
        new_node.instance_variable_set(:@improper, is_improper)
        tail.instance_variable_set(:@tail, new_node)
        tail.instance_variable_set(:@improper, is_improper)
        tail.immutable!
        tail = new_node
        if not Erlang.is_list(list.tail)
          new_node = Erlang::Cons.allocate
          new_node.instance_variable_set(:@head, list.tail)
          new_node.instance_variable_set(:@improper, is_improper)
          tail.instance_variable_set(:@tail, new_node)
          tail.instance_variable_set(:@improper, is_improper)
          tail.immutable!
          tail = new_node
          list = Erlang::Nil
        else
          list = list.tail
        end
      end
      if not tail.immutable?
        tail.instance_variable_set(:@tail, other)
        tail.immutable!
      end
      return out.tail
    end
def append(other)
      # raise Erlang::ImproperListError if improper?
      other = Erlang.from(other)
      return self if not improper? and Erlang.is_list(other) and other.empty?
      return other if Erlang.is_list(other) and empty?
      is_improper = Erlang.is_list(other) ? other.improper? : true
      out = tail = Erlang::Cons.allocate
      list = self
      until list.empty?
        new_node = Erlang::Cons.allocate
        new_node.instance_variable_set(:@head, list.head)
        new_node.instance_variable_set(:@improper, is_improper)
        tail.instance_variable_set(:@tail, new_node)
        tail.instance_variable_set(:@improper, is_improper)
        tail.immutable!
        tail = new_node
        if not Erlang.is_list(list.tail)
          new_node = Erlang::Cons.allocate
          new_node.instance_variable_set(:@head, list.tail)
          new_node.instance_variable_set(:@improper, is_improper)
          tail.instance_variable_set(:@tail, new_node)
          tail.instance_variable_set(:@improper, is_improper)
          tail.immutable!
          tail = new_node
          list = Erlang::Nil
        else
          list = list.tail
        end
      end
      if not tail.immutable?
        tail.instance_variable_set(:@tail, other)
        tail.immutable!
      end
      return out.tail
    end
Return a `List` with all items from this `List`, followed by all items from
 `other`.

 @example
   Erlang::List[1, 2, 3].append(Erlang::List[4, 5])
   # => Erlang::List[1, 2, 3, 4, 5]

 @param other [List] The list to add onto the end of this one
 @return [List]