`cowboy_bstr` 분석
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/1
와 to_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-version
을 Sec-Websocket-Version
으로 바꿔준다. 코드 분석은 생략한다.