def zip(others)
      raise Erlang::ImproperListError if improper?
      others = Erlang.from(others)
      raise ArgumentError, "others must be of Erlang::List type" if not Erlang.is_list(others)
      return self if empty? && others.empty?
      out = tail = Erlang::Cons.allocate
      list = self
      until list.empty? or others.empty?
        new_node = Erlang::Cons.allocate
        new_node.instance_variable_set(:@head, Erlang::Cons.new(list.head, Erlang::Cons.new(others.head)))
        new_node.instance_variable_set(:@improper, false)
        tail.instance_variable_set(:@tail, new_node)
        tail.instance_variable_set(:@improper, false)
        tail.immutable!
        tail = new_node
        list = list.tail
        others = others.tail
      end
      if not tail.immutable?
        tail.instance_variable_set(:@tail, Erlang::Nil)
        tail.immutable!
      end
      return out.tail
    end
def zip(others)
      raise Erlang::ImproperListError if improper?
      others = Erlang.from(others)
      raise ArgumentError, "others must be of Erlang::List type" if not Erlang.is_list(others)
      return self if empty? && others.empty?
      out = tail = Erlang::Cons.allocate
      list = self
      until list.empty? or others.empty?
        new_node = Erlang::Cons.allocate
        new_node.instance_variable_set(:@head, Erlang::Cons.new(list.head, Erlang::Cons.new(others.head)))
        new_node.instance_variable_set(:@improper, false)
        tail.instance_variable_set(:@tail, new_node)
        tail.instance_variable_set(:@improper, false)
        tail.immutable!
        tail = new_node
        list = list.tail
        others = others.tail
      end
      if not tail.immutable?
        tail.instance_variable_set(:@tail, Erlang::Nil)
        tail.immutable!
      end
      return out.tail
    end
Combine two lists by "zipping" them together.  The corresponding elements
 from this `List` and each of `others` (that is, the elements with the
 same indices) will be gathered into lists.

 If `others` contains fewer elements than this list, `nil` will be used
 for padding.

 @example
   Erlang::List["A", "B", "C"].zip(Erlang::List[1, 2, 3])
   # => Erlang::List[Erlang::List["A", 1], Erlang::List["B", 2], Erlang::List["C", 3]]

 @param others [List] The list to zip together with this one
 @return [List]