인용은 프로그램처럼 생긴 글을 살펴볼 데이터로 바꾼다.
quote로 기호와 리스트를 평가하지 않은 채 유지하고 기호·객체 정체성과 재귀적 구조 동등성을 구분합니다.
평가기에게 (+ x 3)이 실행할 적용인지 살펴볼 리스트인지 어떻게 알려 줄까요?
- quote 문법을 평가와 기호 데이터 사이의 경계로 읽기
- 식처럼 생긴 리스트를 보통 선택자로 살펴보기
- 선택한 원소만 평가하면서 새 기호 리스트 만들기
- 기호나 객체 정체성 질문에 eq? 사용하기
- 재귀적 구조 비교에 equal? 사용하기
인용한 식 (+ x 3)은 원소 세 개짜리 리스트입니다. 첫 원소는 기호 +이고 둘째 원소는 기호 x이며 인용한 리스트를 만들 때 어느 이름도 조회하지 않습니다. 반면 (list '+ x 3)은 + 기호만 인용하고 x는 10으로 평가하여 데이터 리스트 (+ 10 3)을 만듭니다.
eq?는 두 피연산자가 같은 기호나 객체 정체성을 나타내는지 묻습니다. equal?은 복합 데이터 안으로 내려가 구조와 잎을 비교합니다. 따라서 두 번째 프로그램은 하나의 공유 리스트와 내용이 같은 별도 리스트를 구분하면서 구조적 동등성은 인정합니다.
- 출력
- —
- 값
- —
- 진단
- —
첫 프로그램은 ((+ x 3) + x (+ 10 3) #t #t #f)를 반환합니다. 두 번째 프로그램은 (#t #f #t #t #t)를 반환합니다.
quote가 +와 x를 조회하지 않고 데이터를 만드는지 확인하세요. 그 리스트에 car와 cadr를 적용한 뒤 x를 평가하여 (+ 10 3)을 만드는 경로와 비교하세요. 정체성 예제에서는 equal?이 두 리스트를 순회하기 전에 alias 바인딩과 별도 할당된 copy를 구분하세요.
프로그램을 수정하고 결과를 비교해 보세요.
x를 평가하지 않고 기호 식 (* (+ x 1) (+ x 1))을 만드세요. 그 다음 x 위치 하나만 현재 숫자 값으로 바꾼 두 번째 리스트를 만들고 equal?로 두 구조를 비교하세요.
힌트 보기
첫 식 전체를 인용하세요. 두 번째 식은 연산자 기호를 인용하고 평가하려는 원소 하나만 리스트 구성 중에 계산하세요.