<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Sun, Mar 6, 2016 at 9:50 PM Richard A. O'Keefe <<a href="mailto:ok@cs.otago.ac.nz">ok@cs.otago.ac.nz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 6/03/16 3:22 am, Garrett Smith wrote:<br>
<br>
> On Sat, Mar 5, 2016 at 4:04 AM Jesper Louis Andersen<br>
> <<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a><br>
> <mailto:<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>>> wrote:<br>
><br>
>     So to catch up:<br>
><br>
>     * On Richard's comments of other uses than for a string:<br>
><br>
>     The obvious use in Erlang is to produce iolist() types for binary<br>
>     data: intersperse($, [<<"a">>, <<"b">>, <<"c">>]) is relatively<br>
>     common in my code. The slightly less obvious use is to interleave<br>
>     a simplifier step in between every optimization step of a<br>
>     compiler, but I've only done that once in my life and I'm not sure<br>
>     it is that useful :)<br>
><br>
><br>
> Yep, iolists is the application I have for this.<br>
<br>
This looks like a "string" use to me (in the sense of data type for<br>
representing<br>
text, not in the list of character code sense).<br>
<br>
I always worry about things like this because of the difficulty the receiver<br>
will have decoding it.  Reverting to lists for a minute, suppose I do<br>
intersperse($,, ["a,b","c,,,d"]) and write the resulting iolist, or<br>
intercalate(",", ["a,b","c,,,d"]).<br>
How does the receiver decode "a,b,c,,,d" so as to recover the original<br>
input?<br>
<br>
For example, I might use an escape character.<br>
Let's say the escape character is #.<br>
I'd want to generate "a#,b,c#,#,#,d".<br>
<br>
Here is a paragraph from the documentation of my Smalltalk system.<br>
<br>
  Joining is intrinsically problematic.  Just pasting a bunch of things<br>
  together is normally not an issue, but introducing a separator may<br>
  mislead you into thinking that the output can be decoded. It is<br>
  especially tempting when there is a related 'split' method.  Consider<br>
     $, join: #('a' 'b' 'c')   ===> 'a,b,c'<br>
     $, split: 'a,b,c'         ===> an OrderedCollection('a' 'b' 'c')<br>
  in Pharo.  Doesn't it look as though these are inverses? But try<br>
     $, join: #('a,b' 'c,,,d') ===> 'a,b,c,,,d'<br>
     $, split: 'a,b,c,,,d'     ===> an OrderedCollection('a' 'b' 'c' ''<br>
'' 'd')<br>
  No, they are not inverses.  True inverses would be something like<br>
     $, join: #('a,b' 'c,,,d') escape: $#<br>
     ===> 'a#,b,c#,#,#,d'<br>
     $, split: 'a#,b,c#,#,#,d' escape: $#<br>
     ===> anOrderedCollection('a,b' 'c,,,d').<br>
  But those methods do not exist in Pharo.  Use splitting and joining<br>
  methods with vigilant trepidation; make sure that your separator<br>
  does *not* appear in the data you are joining.<br>
<br>
<br>
The use of binaries really doesn't change this: as long as what I'm going to<br>
do is to send a sequence of characters somewhere, I need a documented<br>
justification for sending something I can't decode.<br>
<br>
In your actual use, you may KNOW that the separator cannot appear in<br>
the list elements you're gluing together, so for you it may be safe.<br></blockquote><div><br></div><div>I agree to use lists:join with vigilance and trepidation. It won't make it any less useful.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The problem with 'join' as a name is that it is hopelessly vague.<br>
Xs++Ys joins Xs and Ys.  [{K,X,Y} || {K,X} <- Xs, {K,Y} <- Ys} also<br>
joins Xs and Ys.  Some versions of join will let me do<br>
"a, b, and c" and some won't. And so it goes.<br></blockquote><div><br></div><div>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.</div></div></div>