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는 '인간 알파벳' 프로젝트 작업을 좀 해야 해서, 필요한 단어 몇 개를 프로그래밍하는 일을 도와줄 수 있겠냐고 물어봐요.
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
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
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)
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
Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.