2 min read

`cowboy_bstr` 분석

`cowboy_bstr` 분석
Photo by Phinehas Adams / Unsplash

cowboy_bstr 모듈은 binary string을 다루는 utility 함수들을 포함하고 있으며 cowboy에서 사용하기 위한 것이다. erlang의 특징인 패턴 매칭에 의한 함수 분기와 함께, 리스트 해석구문과 유사한 bit string 해석구문을 볼 수 있다.

char_to_lower/1, char_to_upper/1는 한 캐릭터를 소문자로 혹은 대문자로 바꾸는 함수이다. 코드는 간단하다. 인수가 ’A’부터 ‘Z’까지 알파벳 중의 하나에 해당되면 대문자 또는 소문자를 반환한다. 그 외에는 인수를 그대로 반환한다.

% char_to_lower/1
char_to_lower($A) -> $a;
char_to_lower($B) -> $b;
% (C to Y ...)
char_to_lower($Z) -> $z;
char_to_lower(Ch) -> Ch.

% char_to_upper/1
char_to_upper($a) -> $A;
char_to_upper($b) -> $B;
% (c to y ...)
char_to_upper($z) -> $Z;
char_to_upper(Ch) -> Ch.

to_lower/1to_upper/1 함수는 바이너리 문자열을 대문자로 혹은 소문자로 바꾼다. 각각 한 캐릭터씩 대소문자로 바꾸는 char_to_lower/1, char_to_upper/1 함수를 사용하는 고차함수이며, 이를 위해 bit string 해석구문을 사용한다.

to_lower(B) ->
  << << (char_to_lower(C)) >> || <<C>> <= B >>.

to_upper(B) ->
  << << (char_to_upper(C)) >> || <<C>> <= B >>.

인수 B를 받으면 해석구문에서는 한 캐릭터 씩 C로 받는다. || 좌항에서는 이를 받아서 char_to_lower(C) 또는 char_to_upper(C) 함수를 통해 대소문자 변환을 하고 <<...>> 연산자로 바이너리 문자열로 바꾼다.

다음은 리스트 해석구문과 bit string 해석구문 문법의 유사성을 한눈에 보기 위해 나란히 나열한 것이다.

% list comprehension (erlang.org)
[Expr || Qualifier1, ..., QualifierN]

% bit string comprehension (erlang.org)
<< BitStringExpr || Qualifier1, ..., QualifierN >>

실제 사용 예는 다음과 같다.

% list comprehension (erlang.org)
1> [X*2 || X <- [1, 2, 3]].
[2, 4, 6]

% bit string comprehension (erlang.org)
2> << << (X*2) >> || <<X>> <= <<1, 2, 3>> >>.
<<2, 4, 6>>

그 외에 cowboy_bstr 모듈에는 capitalize_token/1 함수가 있는데, 이 함수는 HTTP 메시지의 헤더 문자열 포맷팅하기 위한 것으로 문자열의 첫 문자와 - 문자의 다음 문자만 대문자로 바꾸고 나머지는 소문자로 바꾸는 함수이다. 예를 들면 sec-WEBSOCKET-versionSec-Websocket-Version으로 바꿔준다. 코드 분석은 생략한다.

— END OF POST.