데이터는 인터페이스가 약속한 동작일 수 있다.
쌍과 점을 프로시저로 표현하고 저장 위치를 직접 읽지 않고 선택자와 메시지만으로 성분을 되찾습니다.
생각해 볼 질문
생성자와 선택자가 같은 계약을 만족한다면 추상 데이터 값은 반드시 한 가지 물리 표현을 가져야 할까요?
- 생성자·선택자 계약을 추상 데이터의 의미로 이해하기
- 선택자 프로시저를 받는 프로시저로 쌍 표현하기
- 직접 car·cdr 저장 없이 중첩된 프로시저 쌍의 성분 되찾기
- 메시지 디스패치를 또 다른 프로시저 표현으로 사용하기
- 클라이언트 코드를 표현 기법과 분리하기
cons-proc는 두 성분을 위한 보통 쌍을 만들지 않습니다. x와 y를 기억하고 나중에 두 값을 선택자에 넘기는 프로시저를 반환합니다. car-proc와 cdr-proc는 한 성분을 고르는 선택자를 전달합니다. 인쇄된 저장 모양이 아니라 계약이 쌍 연산을 정의하므로 중첩된 값도 같은 방식으로 동작합니다.
점 예제는 메시지 디스패치를 사용합니다. make-point는 x, y, sum 메시지에 답하는 프로시저를 반환합니다. 선택자는 그 메시지만 압니다. 같은 관찰 가능한 생성자·선택자 동작을 제공한다면 보통 쌍이나 벡터나 다른 클로저로 구현을 바꿀 수 있습니다.
SICP 코드UTF-8 421 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
프로시저 쌍 프로그램은 (left right 1 2 3)을 반환합니다. 메시지 점 프로그램은 (3 4 7 unknown-message)를 반환합니다.
클로저를 만드는 생성자 호출과 나중에 그 클로저를 부르는 선택자 호출을 구분하세요. 중첩 쌍에서는 cdr-proc 결과가 또 다른 프로시저 쌍임을 따라가세요. 점 예제에서는 하나의 포획된 x·y 환경이 여러 메시지에 답하는 과정을 찾으세요.
프로그램을 수정하고 결과를 비교해 보세요.
make-point에 x와 y를 바꾼 새 프로시저 점을 반환하는 swap 메시지를 추가하세요. 결과는 x-point와 y-point만 사용해 확인하세요.
힌트 보기
디스패치 프로시저 안에서 make-point를 다시 호출할 수 있습니다. 클라이언트는 여전히 표현을 직접 읽을 필요가 없습니다.