def intersperse(sep)
      raise Erlang::ImproperListError if improper?
      return self if tail.empty?
      sep = Erlang.from(sep)
      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, false)
        if not list.tail.empty?
          sep_node = Erlang::Cons.allocate
          sep_node.instance_variable_set(:@head, sep)
          sep_node.instance_variable_set(:@improper, false)
          new_node.instance_variable_set(:@tail, sep_node)
          new_node.immutable!
        end
        tail.instance_variable_set(:@tail, new_node)
        tail.instance_variable_set(:@improper, false)
        tail.immutable!
        if list.tail.empty?
          tail = new_node
        else
          tail = new_node.tail
        end
        list = list.tail
      end
      if not tail.immutable?
        tail.instance_variable_set(:@tail, Erlang::Nil)
        tail.immutable!
      end
      return out.tail
    end
def intersperse(sep)
      raise Erlang::ImproperListError if improper?
      return self if tail.empty?
      sep = Erlang.from(sep)
      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, false)
        if not list.tail.empty?
          sep_node = Erlang::Cons.allocate
          sep_node.instance_variable_set(:@head, sep)
          sep_node.instance_variable_set(:@improper, false)
          new_node.instance_variable_set(:@tail, sep_node)
          new_node.immutable!
        end
        tail.instance_variable_set(:@tail, new_node)
        tail.instance_variable_set(:@improper, false)
        tail.immutable!
        if list.tail.empty?
          tail = new_node
        else
          tail = new_node.tail
        end
        list = list.tail
      end
      if not tail.immutable?
        tail.instance_variable_set(:@tail, Erlang::Nil)
        tail.immutable!
      end
      return out.tail
    end
Return a new `List` with `sep` inserted between each of the existing elements.

 @example
   Erlang::List["one", "two", "three"].intersperse(" ")
   # => Erlang::List["one", " ", "two", " ", "three"]

 @return [List]