트랙
/
Factor
Factor
/
연습 문제
/
문자 탐구
문자 탐구

문자 탐구

학습 연습 문제

소개

Factor에서 문자는 정수, 즉 유니코드 코드 포인트예요. 그래서 숫자 비교 연산자 <, >, =만으로도 대소문자를 구분하는 순서를 바로 얻을 수 있어요. unicode 보캐뷸러리는 유니코드를 인식하는 술어와 단일 문자 대소문자 변환을 추가해요.

문자 술어

LETTER?  ( c -- ? )    ! uppercase letter
letter?  ( c -- ? )    ! lowercase letter
Letter?  ( c -- ? )    ! letter, either case
digit?   ( c -- ? )    ! decimal digit
digit>   ( c -- n )    ! the integer value of a digit char
blank?   ( c -- ? )    ! whitespace
USING: unicode ;

CHAR: A LETTER? .    ! => t
CHAR: a letter? .    ! => t
CHAR: 7 digit?  .    ! => t
CHAR: 7 digit>  .    ! => 7

대소문자 변환

ch>upper과 ch>lower는 문자 하나를 뒤집어요. 문자열 수준의 >upper과 >lower는 이를 문자열의 모든 문자에 적용해요.

CHAR: a ch>upper .   ! => 65   (which is CHAR: A)
"Hello" >upper .     ! => "HELLO"

capitalize는 문자열 전체를 소문자로 만든 다음 첫 문자를 대문자로 바꿔요. 단어 하나에 적용한 타이틀 케이스죠.

"hELLO" capitalize .   ! => "Hello"

문자 리터럴

CHAR: A는 A의 정수 코드 포인트로 파싱돼요. 이름이 있는 문자에는 space, tab, \n 같은 이름을 사용해요.

CHAR: A .        ! => 65
CHAR: space .    ! => 32
CHAR: \n .       ! => 10

심볼

어떤 단어가 값 대신 태그를 반환해야 할 때가 있어요. 이를테면 불리언 대신 yes/no/maybe를 반환하는 경우죠. 이럴 때는 각 태그를 심볼로 선언해요. 심볼은 호출되면 자기 자신을 푸시하는 단어이고, 두 심볼은 이름이 같을 때만 서로 같다고 비교돼요.

USING: kernel ;

SYMBOLS: yes no maybe ;

yes .    ! => yes
yes yes = .    ! => t
yes no = .     ! => f

심볼 하나를 선언할 때는 SYMBOL: name처럼 쓰고, 여러 개를 선언할 때는 SYMBOLS: a b c ;처럼 써요.

지침

젊은 Forth 외계인 Heidi는 '인간 알파벳' 프로젝트 작업을 좀 해야 해서, 필요한 단어 몇 개를 프로그래밍하는 일을 도와줄 수 있겠냐고 물어봐요.

1. 두 문자 비교하기

compare-chars는 두 문자를 받아서, 첫 번째가 두 번째보다 작으면 less, 크면 greater, 같으면 equal 기호를 반환하도록 정의해요. 대소문자를 구분해서 비교해요.

CHAR: A CHAR: B compare-chars .   ! => less
CHAR: B CHAR: A compare-chars .   ! => greater
CHAR: A CHAR: A compare-chars .   ! => equal
CHAR: A CHAR: a compare-chars .   ! => less

2. 문자의 크기 알아내기

Heidi는 문자가 "big"(대문자)인지, "small"(소문자)인지, 아니면 크기가 없는지 알아야 해요. size-of-char는 big, small, no-size를 반환하도록 정의해요.

CHAR: A size-of-char .       ! => big
CHAR: a size-of-char .       ! => small
CHAR: 5 size-of-char .       ! => no-size
CHAR: space size-of-char .   ! => no-size

3. 문자의 크기 바꾸기

Heidi는 가끔 문자의 크기를 다른 쪽으로 바꿔야 해요. change-size-of-char는 문자와 원하는 크기(big 또는 small)를 받아서, 그에 맞는 대소문자의 문자를 반환하도록 정의해요.

CHAR: a big change-size-of-char .     ! => 65   (CHAR: A)
CHAR: A small change-size-of-char .   ! => 97   (CHAR: a)

4. 문자의 종류 알아내기

Heidi는 그 문자가 어떤 종류인지도 알아야 해요. type-of-char는 다음을 반환하도록 정의해요.

  • alpha는 모든 문자(대문자 또는 소문자)에 대해
  • numeric은 십진수 숫자에 대해
  • space는 공백 문자에 대해
  • newline은 줄 바꿈 문자에 대해
  • unknown은 그 외의 경우에 대해
CHAR: A type-of-char .       ! => alpha
CHAR: 5 type-of-char .       ! => numeric
CHAR: space type-of-char .   ! => space
CHAR: \n type-of-char .      ! => newline
CHAR: ! type-of-char .       ! => unknown
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Factor Exercism

문자 탐구 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.