Factor에 오신 것을 환영해요! Factor는 연결형 언어예요. square(add(2, 3))처럼 함수를 호출하는 대신, 워드를 왼쪽에서 오른쪽으로 나열해요. 2 3 + square처럼요. 각 워드는 공유된 데이터 스택을 통해 서로 값을 주고받아요. 부두에 쌓인 화물 상자 더미를 떠올려 봐요. 가장 최근에 놓인 것이 맨 위에 있어요.
!는 한 줄 주석을 시작해요. Factor는 !부터 줄 끝까지 모두 무시해요. 아래 예제에서는 !로 코드가 하는 일을 설명해요.
리터럴을 쓰면 그 값이 스택 맨 위에 푸시돼요. 코드는 왼쪽에서 오른쪽으로 읽어요.
1 2 3 ! stack (bottom → top): 1 2 3
모든 워드는 스택 맨 위에서 입력을 읽고, 그 자리에 출력을 다시 써요. .는 맨 위의 값을 팝해서 출력하고, .s는 아무것도 소비하지 않고 스택 전체를 출력해요. 코드 조각이 무엇을 남겼는지 확인할 때 편리해요.
모든 워드는 ( inputs -- outputs ) 형태의 스택 효과로 문서화돼요. 이는 워드의 계약이에요. 워드는 스택 맨 위에서 입력을 팝하고, 그 자리에 출력을 남겨요. 안에 있는 이름들은 사람을 위한 설명이에요. 스택 자체는 이름이 아니라 위치로 정해져요. 스택 맨 위가 오른쪽 이름이에요.
:는 워드 정의를 시작하고, 그다음에 스택 효과가 오고, 그다음에 본문이 오고, ;로 끝나요. Factor의 컴파일러는 본문이 스택 효과가 선언한 대로 정말 남기는지 검사해요.
: restow ( a b -- b a ) swap ;
이 kernel 워드들은 산술 연산 없이 스택 맨 위를 재배치해요. 그저 상자를 이리저리 옮길 뿐이에요.
dup ( x -- x x ) ! copy the top crate
drop ( x -- ) ! remove the top crate
swap ( x y -- y x ) ! flip the top two
over ( x y -- x y x ) ! copy the second crate onto the top
nip ( x y -- y ) ! remove the second crate
rot ( x y z -- y z x ) ! roll the third crate up to the top
상자 하나를 두 워드에 공급해야 할 때는 dup을, 상자를 버릴 때는 drop을, 맨 위 두 개의 순서가 잘못됐을 때는 swap을, 아래에 있는 상자를 다룰 때는 over나 nip을, 묻혀 있는 상자를 맨 위로 끌어올릴 때는 rot을 사용해요.
더 넓은 계열(-rot, dupd, swapd, 2dup, …)도 같은 개념을 따라요. 그 워드들은 나중에 만나게 될 거예요.
여러 워드를 나란히 쓰면 왼쪽에서 오른쪽으로 실행돼요. 각 워드는 바로 앞 워드가 남긴 스택에 작용해요. 다음은 swap nip이 스택 1 2(아래 → 위)에 한 번에 한 워드씩 작용하는 모습이에요.
1 2 ! 1 2 the starting crates
swap ! 2 1 swap flipped the top two
nip ! 1 nip dropped the 2nd-from-top crate (the 2)
그리고 다음은 같은 시작 상자들에 dup rot을 적용한 모습이에요. 역시 한 번에 한 워드씩이요.
1 2 ! 1 2 the starting crates
dup ! 1 2 2 dup copied the top crate
rot ! 2 2 1 rot rolled the 3rd-from-top crate up to the top
워드는 lowercase-kebab-case를 사용해요. 소문자를 하이픈으로 이어 붙이는 방식이에요.
부두에서 화물 상자를 다시 정리하는 갑판원이에요. 각 과제는 단어 하나이고, 그 단어의 본문에서는 셔플 단어만 사용해요. 산술 연산은 쓰지 않아요.
swap-crates 단어를 정의해요. 스택에서 상자 두 개를 꺼내고, 순서를 서로 바꿔서 그대로 남겨요.
1 2 swap-crates .s
! 2
! 1
clear-spill 단어를 정의해요. 스택에서 상자 세 개를 꺼내고, 맨 위 상자는 버린 뒤 아래 두 개는 그대로 남겨요.
1 2 3 clear-spill .s
! 1
! 2
peek-under 단어를 정의해요. 스택에서 상자 두 개를 꺼내고, 그 위에 아래쪽 상자의 복사본을 올려서 남겨요.
1 2 peek-under .s
! 1
! 2
! 1
tidy-deck 단어를 정의해요. 스택에서 상자 세 개를 x y z 순서로 꺼내고, z z y를 남겨요. 맨 아래 상자는 버린 다음, 맨 위 상자의 복사본 두 개를 가운데 상자 아래에 남겨요.
1 2 3 tidy-deck .s
! 3
! 3
! 2
Exercism에 가입하고 Factor 트랙을 개념 47개연습 문제 163개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.