트랙
/
Factor
Factor
/
연습 문제
/
용의 후손들
용의 후손들

용의 후손들

학습 연습 문제

소개

튜플은 다른 튜플을 확장할 수 있어요. TUPLE: child < parent slots ;는 인스턴스가 parent의 인스턴스이기도 한 클래스를 선언해요. 이런 인스턴스는 자신의 슬롯에 더해 부모의 슬롯도 가지고, 부모의 접근자도 자식에 정의된 것처럼 그대로 동작해요.

USING: accessors ;

TUPLE: animal name age ;
TUPLE: dog < animal breed ;

"Rex" 4 "labrador" dog boa .
! => T{ dog { name "Rex" } { age 4 } { breed "labrador" } }

"Rex" 4 "labrador" dog boa name>> .   ! => "Rex"   (inherited accessor)

boa 슬롯 순서

boa 생성자는 슬롯을 선언 순서대로, 부모 먼저 받아요. 위의 dog의 경우에는 다음과 같아요:

dog boa ( name age breed -- dog )

weeks를 추가한 손자 puppy < dog 의 경우에는 다음과 같아요:

puppy boa ( name age breed weeks -- puppy )

프레디킷 계층

모든 TUPLE: 선언은 프레디킷(name?)을 만들어요. 상속을 하면 프레디킷이 중첩돼서, 모든 자손이 조상의 프레디킷을 만족해요:

"Rex" 4 "labrador" dog boa
dup dog? .        ! => t
dup animal? .     ! => t

그 반대는 성립하지 않아요. dog가 아닌 animal은 dog?를 만족하지 못해요.

미리 보는 내용

제네릭 메서드(M:, generics에서 배워요)도 계층을 따라 디스패치해요. 더 구체적인 오버라이드가 우선하지 않는 한, animal에 정의된 메서드는 모든 자손에 대해 실행돼요. 이 연습 문제 바로 다음에 나오는 boatswains-bilge에서 그것을 보게 될 거예요.

지침

어떤 박물학자가 칼데라 주변에 사는 용들을 목록으로 정리하고 있어요. 용들은 서로 공통된 특징을 지니고 있어요. 모든 용에게는 이름, 색깔, 나이가 있죠. 하지만 각자만의 뚜렷한 방식으로 특화되어 있어요. 이제 용 클래스로 이루어진 작은 상속 트리와, 어떤 자손이든 나이를 먹이는 단어 하나를 만들 거예요.

1. 용 가족

튜플 클래스로 이루어진 상속 트리 전체를 먼저 정의해요(생성자는 뒤따르는 과제에서 만들어요).

  • dragon: name, color, age 슬롯을 가져요.
  • fire-dragon: dragon의 하위 클래스로, flame-temp 슬롯을 추가해요.
  • ice-dragon: dragon의 또 다른 하위 클래스로, chill-temp 슬롯을 추가해요.
  • volcano-dragon: fire-dragon의 하위 클래스로, lava-volume 슬롯을 추가해요.

그다음 dragon에 <dragon> 생성자를 만들어 줘요.

"Falkor" "white" 100 <dragon> name>> .   ! => "Falkor"

2. 불을 뿜는 용들

fire-dragon에 <fire-dragon> 생성자를 만들어 줘요.

"Smaug" "red" 500 1200 <fire-dragon> flame-temp>> .   ! => 1200
"Smaug" "red" 500 1200 <fire-dragon> dragon? .        ! => t

3. 얼음을 뿜는 용들

ice-dragon에 <ice-dragon> 생성자를 만들어 줘요.

"Frosty" "blue" 200 -40 <ice-dragon> chill-temp>> .   ! => -40
"Frosty" "blue" 200 -40 <ice-dragon> fire-dragon? .   ! => f   (siblings)

4. 화산에 사는 용들

volcano-dragon에 <volcano-dragon> 생성자를 만들어 줘요.

"Vesuvius" "red" 1000 1500 99 <volcano-dragon> dragon? .       ! => t
"Vesuvius" "red" 1000 1500 99 <volcano-dragon> fire-dragon? .  ! => t

5. 어떤 용이든 나이 먹이기

age-dragon을 정의해서, 어떤 용(또는 자손)이든 age 슬롯을 하나씩 증가시켜요. 반환하는 값은 없어요.

"Falkor" "white" 100 <dragon> dup age-dragon age>> .   ! => 101

같은 단어가 모든 자손에서 동작해야 해요. 공유 접근자가 있는 이유가 바로 그거예요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Factor Exercism

용의 후손들 문제를 시작해 볼 준비가 됐나요?

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