(Lispex)sicp.io
2.4 · 정체성과 변경

공유된 구조에서는 멀리서도 변경이 보인다.

서로 다른 두 경로가 같은 순서쌍에 닿을 수 있습니다. 어느 경로로든 그 순서쌍을 바꾸면 두 경로에서 보는 값이 모두 달라집니다.

생각해 볼 질문

내용이 같은 것과 하나의 객체를 공유하는 것은 왜 다를까요?

  • 공유된 객체 하나와 내용만 같은 객체 두 개 구분하기
  • 별칭을 통한 변경의 결과 예상하기
  • 그래프 모양의 결과에서 공유 참조 읽기

tree의 car와 cdr은 모두 shared를 저장합니다. 안쪽 리스트를 두 번 복사한 것이 아니라 순서쌍 하나를 두 번 참조합니다. 따라서 set-car!로 바꾸면 양쪽 경로에서 모두 변경된 값을 봅니다.

출력의 #0=는 공유 객체를 처음 소개하고 #0#는 바로 그 객체를 다시 가리킵니다. 이런 표시는 일반 리스트 표기가 감출 수 있는 정체성을 보존합니다.

리스펙스 · SICP 코드SICP에 필요한 Scheme 호환 문법을 리스펙스 SICP 프로필로 실행합니다.
(let ((shared (list 'leaf)))
  (let ((tree (cons shared shared)))
    (set-car! shared 'changed)
    tree))
리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 107 / 1,048,576바이트
예제
결과
출력
진단
보이는 실행 흐름0 / 0 개의 실행 이벤트
    이 브라우저 결과는 리스펙스 바우치나 권한이 아닙니다.wasm —
    예상 관찰

    첫 프로그램은 (#0=(changed) . #0#)를 반환합니다.

    실행 흐름에서 볼 점

    공유된 안쪽 순서쌍이 한 번 할당되고 나중에 한 번 바뀌는 부분을 찾으세요. 결과 그래프의 두 참조는 계속 같은 객체 정체성에 연결되어 있습니다. 이 실행 흐름은 한 번의 실행을 보는 제한된 학습 화면이며 리스펙스 바우치나 권한이 아닙니다.

    직접 해보기

    힌트를 보기 전에 프로그램을 바꿔 보세요.

    서로 다른 순서쌍 예제를 실행하고 결과를 비교하세요. 두 리스트가 처음에는 같은 내용을 가졌어도 left 변경이 right를 바꾸지 않는 이유를 설명하세요.

    힌트 하나 보기

    출력된 leaf의 개수가 아니라 할당된 객체의 수를 세어 보세요.