sicp.io
4.1.4 · 파생 문법

새 문법을 평가기가 이미 아는 규칙으로 다시 쓴다.

let을 lambda 적용으로 바꾸면 바인딩 의미를 유지하면서 평가기 핵심을 작게 둘 수 있습니다.

생각해 볼 질문

let을 lambda 적용으로 바꿀 때 무엇이 그대로 남아야 할까요?

  • 표면 문법과 평가기 핵심 형식 분리하기
  • 바인딩 이름을 lambda 매개변수로 모으기
  • 바인딩 식을 적용 피연산자로 모으기
  • 변환된 식을 원래 환경에서 평가하기

변환기는 let에서 바인딩 이름을 가져와 lambda 매개변수 리스트에 넣습니다. let 본문을 그 lambda에 넣고 바인딩 식들을 lambda 뒤의 적용 피연산자로 배치합니다.

평가기는 지역 바인딩을 위한 두 번째 구현이 필요하지 않습니다. let 경우는 식을 다시 쓰고 그 결과를 같은 환경의 일반적인 lambda와 적용 경우로 다시 보냅니다.

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

    첫 프로그램은 ((lambda (x y) (+ x y)) 10 32)를 반환합니다. 두 번째 프로그램은 42를 반환합니다.

    실행 추적에서 볼 점

    두 번째 실행에서 lambda가 만들어지기 전의 let 디스패치와 변환기 호출을 찾으세요. 이후의 적용은 환경을 x와 y로 확장한 뒤 원래 본문을 평가합니다.

    직접 해보기

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

    값이 8인 z 바인딩을 추가하고 본문을 (+ (+ x y) z)로 바꾸세요. 변환된 식과 그 값을 모두 예상하세요.

    힌트 보기

    매개변수 리스트와 피연산자 리스트는 같은 순서로 늘어납니다. 본문은 lambda 안에서 하나의 식으로 유지됩니다.

    이 수업 완료하기

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