sicp.io
2.2.5 · 그림 언어 · 변환과 합성

기하 변환은 또 다른 페인터를 반환한다.

페인터 변환은 그 페인터에 넘기는 프레임을 바꿉니다. beside와 below와 뒤집기와 회전과 재귀 분할은 프로시저를 합성하고 마지막 실행은 여전히 보통의 유한 선분 목록을 만듭니다.

생각해 볼 질문

몇 가지 프레임 변환만으로 재사용할 수 있는 그림 조합 언어를 어떻게 만들까요?

  • 하위 프레임을 만들어 페인터 변환하기
  • beside와 below를 프로시저 조합기로 정의하기
  • 같은 변환 원시 연산으로 뒤집기와 회전 표현하기
  • 기본 페인터를 바꾸지 않고 네 부분 합성 만들기
  • 깊이에 따라 선분 수가 자라는 재귀 분할 만들기
  • 렌더링한 SVG를 선택한 실행의 선분 transcript와 연결하기

transform-painter는 페인터의 선분 데이터를 다시 쓰지 않습니다. 단위 정사각형의 제어점 세 개를 바깥 프레임으로 옮기고 새 하위 프레임을 만듭니다. 원래 페인터는 그 하위 프레임 안에서 실행됩니다. beside와 below는 변환된 페인터 두 개를 만들고 선분 목록을 이어 붙이며 뒤집기와 회전도 제어점 세 개를 다르게 고른 결과입니다.

첫 실행은 변환한 갈매기 모양 네 개를 한 정사각형에 놓습니다. 두 번째는 right-split을 재귀적으로 정의합니다. 왼쪽 절반에는 원래 페인터를 두고 오른쪽 절반에는 작은 복사본 두 개를 위아래로 쌓습니다. 깊이 3에서 선분 세 개짜리 기본 페인터는 옮긴 선분 45개를 만듭니다. 시각화는 리스펙스가 출력한 SEG 줄만 그리며 브라우저 렌더링 제한은 런타임 자체의 실행 한도와 구분됩니다.

SICP 코드UTF-8 4,491 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    그림 언어프로그램이 생성한 선분을 렌더링합니다.
    런타임 불러오는 중
    이 실행에서는 유효한 SEG 라인이 생성되지 않았습니다.
    프로그램 출력에서 0개의 선분이 렌더링되었습니다.
    SVG는 브라우저 실행에서 출력된 SEG 라인을 렌더링합니다.
    예상 결과

    네 부분 합성은 SEG 줄 열두 개를 출력하고 (segments 12)를 반환합니다. 깊이 3 right-split은 SEG 줄 45개를 출력하고 (segments 45)를 반환합니다. 두 SVG 모두 선택한 리스펙스 transcript에서 만들어집니다.

    실행 추적에서 볼 점

    기본 페인터가 선분을 옮기기 전에 transform-painter가 하위 프레임을 만드는 각 호출을 찾으세요. right-split에서는 재귀 깊이를 따라 반환되는 페인터 프로시저를 본 뒤 프로시저 합성과 paint 시점의 유한 선분 생산을 구분하세요.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    원래 페인터를 아래에 두고 작은 복사본 두 개를 옆으로 놓아 그 위에 쌓는 up-split을 정의하세요. 깊이 3을 그리기 전에 선분 수를 예상하세요.

    힌트 보기

    below painter (beside smaller smaller)를 사용하세요. 양의 깊이마다 현재 복사본 하나와 작은 복사본 두 개를 만들므로 선분 수 점화식은 right-split과 같습니다.

    이 수업 완료하기

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