sicp.io
2.5.1 · 범용 산술 연산

공통 메서드를 찾기 위해 올리고 정보가 보존될 때만 내린다.

명시적인 올리기, 같은 타입 덧셈, 동등성, 투영, 보수적인 결과 단순화를 갖춘 정수–유리수–복소수 tower를 만듭니다.

생각해 볼 질문

혼합 산술은 어떻게 공통 타입을 찾고 정보를 잃지 않으면서 다시 더 단순한 타입으로 돌아갈까요?

  • 수치 tower의 모든 타입에 명시적인 순위 부여하기
  • 두 피연산자가 같은 메서드를 가질 때까지 낮은 값을 올리기
  • 같은 타입 산술과 coercion 정책을 분리하기
  • 투영한 값을 다시 올렸을 때 원래 값이 되는 경우에만 결과 내리기
  • 0이 아닌 허수 성분을 잃게 되는 복소수는 보존하기

add는 먼저 더 낮은 순위의 피연산자를 올려 두 값의 태그를 같게 만듭니다. 그 뒤 same-type-add는 표현별 산술만 수행합니다. 정수는 분모 1인 유리수로 올라가고 유리수는 허수부가 0인 복소수로 올라갑니다. 어떤 변환을 허용할지는 산술 메서드가 결정하지 않습니다.

drop은 반대 방향을 보수적으로 시도합니다. 유리수는 분모가 1일 때만 정수로 투영되고 복소수는 허수부가 정확히 0일 때만 실수 성분으로 투영됩니다. 투영한 값을 다시 올려 원래 값과 비교한 뒤에만 단순화를 계속하므로 0이 아닌 허수 성분은 사라지지 않습니다.

SICP 코드UTF-8 3,793 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    예상 결과

    프로그램은 ((rational 7 2) (integer 1) (integer 5) (complex (rational 3 1) (rational 1 1)))을 반환합니다.

    실행 추적에서 볼 점

    각 add 호출에서 처음 두 순위와 모든 raise를 기록하세요. 그 다음 같은 타입 메서드 하나만 실행되는지 확인하세요. 내리기에서는 project, raise, generic-equal?을 따라가세요. 허수부가 0인 복소수 결과는 integer 5까지 내려가지만 마지막 결과는 허수부가 남아 complex로 유지됩니다.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    같은 세 타입의 범용 곱셈을 추가하고 기존 올리기와 내리기 경로를 재사용하세요. 정수가 되는 유리수 곱과 허수부가 0이 아닌 복소수 곱을 함께 검사하세요.

    힌트 보기

    변환은 같은 타입 메서드 밖에 두세요. 복소수 곱은 두 성분에 대한 유리수 덧셈·뺄셈·곱셈이 필요합니다.

    이 수업 완료하기

    이 장의 총 20개 수업 중 0개 완료0%