[erlang-questions] Proposal: add lists:intersperse/2 and lists:intercalate/2

Garrett Smith <>
Mon Mar 7 16:08:06 CET 2016


On Sun, Mar 6, 2016 at 9:50 PM Richard A. O'Keefe <> wrote:

> On 6/03/16 3:22 am, Garrett Smith wrote:
>
> > On Sat, Mar 5, 2016 at 4:04 AM Jesper Louis Andersen
> > <
> > <mailto:>> wrote:
> >
> >     So to catch up:
> >
> >     * On Richard's comments of other uses than for a string:
> >
> >     The obvious use in Erlang is to produce iolist() types for binary
> >     data: intersperse($, [<<"a">>, <<"b">>, <<"c">>]) is relatively
> >     common in my code. The slightly less obvious use is to interleave
> >     a simplifier step in between every optimization step of a
> >     compiler, but I've only done that once in my life and I'm not sure
> >     it is that useful :)
> >
> >
> > Yep, iolists is the application I have for this.
>
> This looks like a "string" use to me (in the sense of data type for
> representing
> text, not in the list of character code sense).
>
> I always worry about things like this because of the difficulty the
> receiver
> will have decoding it.  Reverting to lists for a minute, suppose I do
> intersperse($,, ["a,b","c,,,d"]) and write the resulting iolist, or
> intercalate(",", ["a,b","c,,,d"]).
> How does the receiver decode "a,b,c,,,d" so as to recover the original
> input?
>
> For example, I might use an escape character.
> Let's say the escape character is #.
> I'd want to generate "a#,b,c#,#,#,d".
>
> Here is a paragraph from the documentation of my Smalltalk system.
>
>   Joining is intrinsically problematic.  Just pasting a bunch of things
>   together is normally not an issue, but introducing a separator may
>   mislead you into thinking that the output can be decoded. It is
>   especially tempting when there is a related 'split' method.  Consider
>      $, join: #('a' 'b' 'c')   ===> 'a,b,c'
>      $, split: 'a,b,c'         ===> an OrderedCollection('a' 'b' 'c')
>   in Pharo.  Doesn't it look as though these are inverses? But try
>      $, join: #('a,b' 'c,,,d') ===> 'a,b,c,,,d'
>      $, split: 'a,b,c,,,d'     ===> an OrderedCollection('a' 'b' 'c' ''
> '' 'd')
>   No, they are not inverses.  True inverses would be something like
>      $, join: #('a,b' 'c,,,d') escape: $#
>      ===> 'a#,b,c#,#,#,d'
>      $, split: 'a#,b,c#,#,#,d' escape: $#
>      ===> anOrderedCollection('a,b' 'c,,,d').
>   But those methods do not exist in Pharo.  Use splitting and joining
>   methods with vigilant trepidation; make sure that your separator
>   does *not* appear in the data you are joining.
>
>
> The use of binaries really doesn't change this: as long as what I'm going
> to
> do is to send a sequence of characters somewhere, I need a documented
> justification for sending something I can't decode.
>
> In your actual use, you may KNOW that the separator cannot appear in
> the list elements you're gluing together, so for you it may be safe.
>

I agree to use lists:join with vigilance and trepidation. It won't make it
any less useful.


> The problem with 'join' as a name is that it is hopelessly vague.
> Xs++Ys joins Xs and Ys.  [{K,X,Y} || {K,X} <- Xs, {K,Y} <- Ys} also
> joins Xs and Ys.  Some versions of join will let me do
> "a, b, and c" and some won't. And so it goes.
>

It's vague, as is intercalculate, but as it's superficially doing what
string "join" does with chars has some precedence within Erlang. I wouldn't
call it hopeless.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20160307/17b32126/attachment.html>


More information about the erlang-questions mailing list