트랙
/
Factor
Factor
/
연습 문제
/
공장 안전 장치
공장 안전 장치

공장 안전 장치

학습 연습 문제

소개

Factor의 오류 시스템은 세 부분으로 이루어져 있어요: 오류를 알리는 throw, 오류를 처리하는 recover, 그리고 나만의 오류 종류를 정의하는 ERROR:예요.

throw

throw는 (kernel에 있는) 오류를 발생시켜요. 인자는 어떤 값이든 될 수 있어요. 문자열, 숫자, 튜플 등 무엇이든 나중에 살펴볼 수 있는 오류가 돼요.

! DOCTEST: SKIP
"file not found" throw

throw는 반환하지 않아요. 현재 word의 나머지 부분은 건너뛰어요.

recover

recover는 (continuations에 있는) Factor의 try/catch예요. try quotation과 recovery quotation을 받아요:

recover ( try recovery -- )

try가 아무것도 던지지 않고 끝나면 recovery는 무시돼요. try가 오류를 던지면, 그 오류가 스택에 푸시되고 recovery가 실행돼요:

[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"

[ "ok" ] [ drop "never runs" ] recover .
! => "ok"

kernel의 when은 자연스러운 짝이에요. 스택 맨 위의 값이 참으로 평가될 때만 quotation을 실행해요:

: check-positive ( n -- )
    0 < [ "negative!" throw ] when ;

ERROR:

ERROR:는 튜플 클래스를 정의하고, 동시에 새로운 인스턴스를 만들어 던지는 word도 정의해요:

! DOCTEST: SKIP
ERROR: not-found path ;

"/missing" not-found
! throws T{ not-found { path "/missing" } }

슬롯이 없는 오류는 그냥 ERROR: name ;예요. name을 호출하면 빈 인스턴스를 던져요. ERROR:로 정의한 튜플에는 클래스 술어 name?이 따라오는데, 잡은 오류가 그 타입인지 검사할 때 쓸 수 있어요.

슬롯을 다시 읽어내기

잡은 오류는 그냥 튜플이라서, 각 ERROR: 슬롯에는 다른 튜플과 똑같이 자동 생성된 slot>> 리더가 따라와요.

! DOCTEST: SKIP
{
    T{ not-found { path "/a" } }
    T{ not-found { path "/b" } }
}
[ path>> ] map .   ! => { "/a" "/b" }

지침

신문 공장의 새 품질 관리자인 Elena가 생산실을 모니터링할 작은 소프트웨어를 하나 만들어 달라고 부탁해요.

1. 사용자 정의 오류 정의하기

ERROR: 파싱 워드로 오류 튜플 클래스 machine-error를 정의해요. 슬롯은 필요 없어요.

machine-error   ! throws a fresh machine-error

2. 습도 확인하기

check-humidity를 정의해요. 이 워드는 스택에서 습도 측정값을 하나 꺼내고, 그 값이 70을 초과하면 문자열 "humidity too high"를 throw해요. 그렇지 않으면 아무것도 반환하지 않아요.

50 check-humidity   ! returns nothing
80 check-humidity   ! throws "humidity too high"

3. 온도 확인하기

check-temperature를 정의해요. 온도 측정값을 하나 꺼내고, 그 값이 500을 초과하면 문자열 "temperature too high"를 throw해요. 그렇지 않으면 아무것도 반환하지 않아요.

400 check-temperature   ! returns nothing
600 check-temperature   ! throws "temperature too high"

4. 기계 모니터링하기

monitor는 스택에서 습도와 온도를 꺼내 두 검사를 모두 실행하도록 정의해요. 두 검사 중 하나라도 throw하면 monitor는 대신 새 machine-error를 throw해야 해요. 둘 다 통과하면 monitor는 아무것도 반환하지 않아요.

50 400 monitor   ! returns nothing
80 400 monitor   ! throws a machine-error
50 600 monitor   ! throws a machine-error

5. 측정값 묶음 모니터링하기

monitor-batch는 { humidity temperature } 측정값들의 배열을 받아서, 그중 몇 개가 실패하는지(즉, 몇 개가 monitor를 throw하게 만드는지)를 반환하도록 정의해요.

{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Factor Exercism

공장 안전 장치 문제를 시작해 볼 준비가 됐나요?

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