sicp.io
1.3.2 · lambda로 프로시저 만들기

lambda는 인자가 오기 전에 프로시저 값을 만든다.

이름 붙인 프로시저와 익명 프로시저를 비교하고 lambda를 곧바로 적용하며 중첩된 프로시저 생성 안에서 어휘 바인딩을 따라갑니다.

생각해 볼 질문

lambda 식은 어떤 값을 만들며, 그 값을 나중에 적용할 때 본문은 어느 바인딩을 사용할까요?

  • lambda를 프로시저 값을 만드는 식으로 읽기
  • define 프로시저 축약을 이름에 lambda 값을 묶는 형태와 연결하기
  • 익명 프로시저에 영구적인 이름을 주지 않고 곧바로 적용하기
  • 중첩된 매개변수 범위를 어휘 조회로 따라가기
  • 방금 만든 프로시저를 평범한 인자 값으로 전달하기

(define (square x) ...) 축약은 이름에 프로시저를 묶습니다. (define square-lambda (lambda (x) ...))라고 쓰면 두 단계가 드러납니다. lambda가 프로시저 값을 만들고 define이 그 값에 이름을 묶습니다. lambda는 곧바로 적용할 수도 있으므로 인자 두 개를 받는 제곱합 프로시저는 오래 남는 최상위 이름이 필요하지 않습니다.

중첩 예제에서 바깥 lambda는 x를 3에 묶고 안쪽 lambda는 y를 4에 묶습니다. 안쪽 본문은 현재 호출에서 y를, 둘러싼 어휘 환경에서 x를 찾습니다. 전역 x는 100으로 남습니다. 마지막 식은 새로 만든 square 프로시저를 다른 lambda에 전달하여 프로시저 생성과 바인딩과 전달과 적용이 모두 보통 값 모형을 따른다는 점을 보여 줍니다.

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

    첫 프로그램은 (36 36 25)를 반환합니다. 두 번째 프로그램은 (100 7 100)을 반환합니다.

    실행 추적에서 볼 점

    프로시저 값을 만드는 각 lambda 평가와 나중에 일어나는 각 적용을 구분하세요. 중첩 프로그램에서는 안쪽 x 조회가 둘러싼 호출 환경에서, y 조회가 현재 호출에서 일어나는지 찾으세요. 전역 x 바인딩은 변경되지 않습니다.

    직접 해보기

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

    바인딩 두 개가 있는 let 식을 매개변수 두 개짜리 lambda의 즉시 적용으로 다시 쓰세요. 그 다음 입력을 세 배로 만드는 lambda를 전달받은 프로시저가 그 프로시저를 두 번 적용하게 하세요.

    힌트 보기

    병렬 바인딩 let은 ((lambda (name ...) body) value ...) 형태로 생각할 수 있습니다. 프로시저 생성과 각 적용을 분리하세요.

    이 수업 완료하기

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