sicp.io
2.3.1 · 인용과 기호 데이터

인용은 프로그램처럼 생긴 글을 살펴볼 데이터로 바꾼다.

quote로 기호와 리스트를 평가하지 않은 채 유지하고 기호·객체 정체성과 재귀적 구조 동등성을 구분합니다.

생각해 볼 질문

평가기에게 (+ x 3)이 실행할 적용인지 살펴볼 리스트인지 어떻게 알려 줄까요?

  • quote 문법을 평가와 기호 데이터 사이의 경계로 읽기
  • 식처럼 생긴 리스트를 보통 선택자로 살펴보기
  • 선택한 원소만 평가하면서 새 기호 리스트 만들기
  • 기호나 객체 정체성 질문에 eq? 사용하기
  • 재귀적 구조 비교에 equal? 사용하기

인용한 식 (+ x 3)은 원소 세 개짜리 리스트입니다. 첫 원소는 기호 +이고 둘째 원소는 기호 x이며 인용한 리스트를 만들 때 어느 이름도 조회하지 않습니다. 반면 (list '+ x 3)은 + 기호만 인용하고 x는 10으로 평가하여 데이터 리스트 (+ 10 3)을 만듭니다.

eq?는 두 피연산자가 같은 기호나 객체 정체성을 나타내는지 묻습니다. equal?은 복합 데이터 안으로 내려가 구조와 잎을 비교합니다. 따라서 두 번째 프로그램은 하나의 공유 리스트와 내용이 같은 별도 리스트를 구분하면서 구조적 동등성은 인정합니다.

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

    첫 프로그램은 ((+ 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?로 두 구조를 비교하세요.

    힌트 보기

    첫 식 전체를 인용하세요. 두 번째 식은 연산자 기호를 인용하고 평가하려는 원소 하나만 리스트 구성 중에 계산하세요.

    이 수업 완료하기

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