트랙
/
Factor
Factor
/
연습 문제
/
화물 뒤섞기
화물 뒤섞기

화물 뒤섞기

학습 연습 문제

소개

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를 사용해요. 소문자를 하이픈으로 이어 붙이는 방식이에요.

둘러보기: 스택 셔플링

지침

부두에서 화물 상자를 다시 정리하는 갑판원이에요. 각 과제는 단어 하나이고, 그 단어의 본문에서는 셔플 단어만 사용해요. 산술 연산은 쓰지 않아요.

1. 맨 위 상자 두 개 자리 바꾸기

swap-crates 단어를 정의해요. 스택에서 상자 두 개를 꺼내고, 순서를 서로 바꿔서 그대로 남겨요.

1 2 swap-crates .s
! 2
! 1

2. 엎질러진 상자 치우기

clear-spill 단어를 정의해요. 스택에서 상자 세 개를 꺼내고, 맨 위 상자는 버린 뒤 아래 두 개는 그대로 남겨요.

1 2 3 clear-spill .s
! 1
! 2

3. 아래에 있는 상자 복사해 두기

peek-under 단어를 정의해요. 스택에서 상자 두 개를 꺼내고, 그 위에 아래쪽 상자의 복사본을 올려서 남겨요.

1 2 peek-under .s
! 1
! 2
! 1

4. 갑판 정리하기

tidy-deck 단어를 정의해요. 스택에서 상자 세 개를 x y z 순서로 꺼내고, z z y를 남겨요. 맨 아래 상자는 버린 다음, 맨 위 상자의 복사본 두 개를 가운데 상자 아래에 남겨요.

1 2 3 tidy-deck .s
! 3
! 3
! 2
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Factor Exercism

화물 뒤섞기 문제를 시작해 볼 준비가 됐나요?

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