프레임은 일관된 패턴 바인딩만 기록한다.
패턴 변수는 처음에는 프레임을 확장하고 다시 나타날 때는 같은 값인지 확인합니다. 질의 시스템의 패턴 매칭이 프레임을 다루는 방식을 예제로 살펴봅니다.
생각해 볼 질문
매처는 두 데이터 구조를 걸으며 부분 지식을 어떻게 전달할까요?
- 패턴 변수를 명시적인 리스트 데이터로 표현하기
- 연관 리스트 프레임에 변수 바인딩 저장하기
- 쌍 구조를 왼쪽에서 오른쪽으로 재귀적으로 매칭하기
- 반복된 변수의 값이 충돌할 때 거부하기
(? who) 형식은 리터럴 리스트가 아니라 패턴 변수를 나타냅니다. 처음 나타날 때 extend-if-consistent는 who와 일치하는 데이터를 프레임에 추가합니다. 일반 기호와 쌍 구조는 직접 일치해야 합니다.
다음에 다시 나타나면 프레임을 확장하기 전에 기존 바인딩을 먼저 조회합니다. 데이터가 같으면 프레임을 유지하고, 데이터가 충돌하면 failed를 반환하여 남은 모든 재귀 단계로 전파합니다. 이는 패턴에 있는 변수를 기준으로 일관된 프레임 바인딩을 구성하는 단방향 매칭을 수행합니다.
SICP 코드UTF-8 970 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
첫 프로그램은 (bob alice)를 반환합니다. 두 번째 프로그램은 (apple failed)를 반환합니다.
cdr 매칭 전에 재귀적 car 매칭을 따라간 다음 각 프레임 확장의 위치를 찾으세요. 두 번째 실행에서는 두 번째 item 조회가 apple 프레임을 한 번 유지하고 pear에 대해서는 failed를 반환하는 과정을 살펴보세요. 실행 흐름은 단방향 패턴 매칭과 모든 프레임 확장을 기록합니다.
프로그램을 수정하고 결과를 비교해 보세요.
첫 번째 패턴을 (parent (? person) (? person))으로 바꾸세요. 실행하기 전에 (parent bob alice)에 대한 결과를 예상하세요.
힌트 보기
두 번째로 나타난 값은 첫 번째로 나타났을 때 저장된 값과 같아야 합니다.