방향이 있는 타입 강제 변환 표는 알려진 혼합 타입 한 쌍을 처리하고, 수치 타워는 정수를 유리수로, 유리수를 복소수로 반복해서 올린 뒤 같은 타입 연산 하나를 적용합니다.
생각해 볼 질문
범용 산술은 실패한 coercion을 숨기거나 동급 표현 사이에서 무한히 왕복하지 않으면서 공통 타입을 어떻게 고를까요?
연산 메서드와 coercion 프로시저 구분하기
방향이 있는 coercion 뒤 범용 연산 다시 시도하기
정수–유리수–복소수 계층을 따라 값 올리기
두 인자가 같은 타입이 된 뒤에만 산술 메서드 적용하기
공통 타입이 없으면 추측하지 않고 실패 상태 보고하기
첫 프로그램에는 유리수 내용 두 개를 더하는 산술 메서드 하나만 있습니다. 정수와 유리수 쌍에는 직접 메서드가 없으므로 apply-generic은 별도 coercion 표를 확인하고 정수를 분모 1인 유리수로 바꾼 뒤 다시 시도합니다. coercion 기록은 추가 표현 단계를 보이게 합니다. 같은 타입 메서드가 없을 때 같은 타입 coercion을 시도하지 않으므로 진전 없는 반복도 피합니다.
두 번째 프로그램은 타입 쌍마다 변환을 고르는 대신 순서가 있는 tower를 사용합니다. rank는 정수와 유리수와 복소수의 층을 정하고, raise는 바로 다음 층으로만 이동하며, raise-to는 두 값이 더 높은 입력 층에 닿을 때까지 반복합니다. 정수와 유리수는 유리수 덧셈을 사용하고 유리수와 복소수는 한 번 더 올린 뒤 복소수 덧셈을 사용합니다. 관련 없는 polynomial 태그는 rank가 없으므로 no-common-type을 반환합니다. tower는 이 세 타입의 순서와 승격 경로를 고정합니다.
coercion 표 프로그램은 ((rational 7 2) ((integer rational)))을 반환합니다. tower 프로그램은 ((rational 5 2) (complex #t #t) no-common-type)을 반환합니다.
실행 추적에서 볼 점
첫 실행에서는 실패한 혼합 타입 조회와 integer-to-rational 변환, 성공한 rational/rational 재시도를 찾으세요. tower 실행에서는 한 단계 정수 올리기와 유리수에서 복소수로 올리기를 비교하고 polynomial 태그에서는 산술 메서드를 실행하기 전에 no-common-type이 나오는지 확인하세요. 이 실행 흐름은 예제에 명시한 변환과 승격 계층을 정확히 기록합니다.
직접 해보기
프로그램을 수정하고 결과를 비교해 보세요.
유리수와 복소수 사이에 real 타입을 추가하세요. 유리수를 real로 올린 뒤 복소수로 올리고, 정수와 복소수를 더할 때 raise가 몇 번 필요한지 예상하세요.
힌트 보기
rank를 갱신하고 raise 하나가 정확히 한 층만 이동하게 하세요. 범용 연산에는 새로운 integer/complex 전용 coercion이 필요하지 않아야 합니다.