binary string용 join 함수

erlang의 string:join/2 함수는 두 개의 문자열을 separator와 함께 결합해주는 역할을 한다.

1> string:join(["Hello", "World"], ", ").
"Hello, World"

보통 C 언어에서의 문자열은 char의 배열이다.

str[0] = 'H',
str[1] = 'e',
str[2] = 'l',
str[3] = 'l',
str[4] = '0',
...

이에 반해 erlang에서의 문자열은 char들의 리스트이다.

str -> ‘H’ -> ‘e’ -> ‘l’ -> ‘l’ -> ‘o’ -> … -> (NULL)

물론 C에서의 문자열과 같은 자료구조가 erlang에도 있는데, binary 포맷이라고 하며 문자열의 경우 <<“Hello”> 로 표현한다. 이 보다 범용적으로는 <<1, 2, 3, 4>> 처럼 byte 크기 정수의 배열을 표현할 수 있다. 그래서 “Hello”를 ASCII 코드 값의 배열로 표현하면 <<72, 101, 108, 108, 111>>가 된다.

배경 설명이 길어졌는데, 그래서 string:join/2는 list 문자열에 대해서만 처리하고 binary 문자열에 대해서는 지원해주지 않는다. 개인적인 필요에 의해서 한 줄 만들어서 사용하고 있었는데, 이것 보다는 잘 작성된 코드를 우연히 찾아서 여기에 공유해보고자 한다. 출처는 Joining A List Of Binaries In Erlang (Example) 이다.

binary_join([], _Sep) ->
  <<>>;
binary_join([Part], _Sep) ->
  Part;
binary_join(List, Sep) ->
  lists:foldr(fun (A, B) ->
    if
      bit_size(B) > 0 -> <<A/binary, Sep/binary, B/binary>>;
      true -> A
    end
  end, <<>>, List).

% binary_join([<<"Hello">>, <<"World">>], <<", ">>).
% <<"Hello, World">>