치환은 본문을 다시 써서 프로시저 적용을 설명한다.
변경이 없는 단순한 프로시저에서는 치환 모형이 매개변수를 인자 식이나 값으로 바꿉니다. 적용적 순서와 정상 순서 일정은 같은 답에 닿으면서도 서로 다른 양의 일을 할 수 있습니다.
치환은 프로시저 적용에서 무엇을 드러내며 인자를 본문에 넣기 전이나 후에 평가하면 무엇이 달라질까요?
- 프로시저 본문과 적용을 인용된 식 데이터로 나타내기
- 본문 전체에서 매개변수를 일관되게 바꾸기
- 적용적 순서의 인자 평가와 정상 순서의 식 전개 구분하기
- 명시적인 정상 순서 모형에서 반복되는 인자 작업 관찰하기
- 설명용 치환 모형과 런타임 환경 내부를 구분하기
- 변경과 객체 정체성에는 단순 치환보다 풍부한 모형이 필요함을 이해하기
첫 프로그램은 리스펙스에게 평가 전략을 바꾸라고 요구하지 않습니다. 호출 (square (+ 2 3))과 본문 (* x x)를 인용된 데이터로 다루고 교과서적인 두 축약 경로를 구성합니다. 적용적 경로는 (+ 2 3)을 먼저 평가해 값 5를 치환하고 (* 5 5)를 축약합니다. 정상 경로는 아직 평가하지 않은 피연산자 식을 먼저 치환해 (* (+ 2 3) (+ 2 3))을 만들고 나서 두 사본을 각각 축약합니다.
두 번째 프로그램은 호출 횟수를 늘리는 argument 프로시저로 작업 차이를 보이게 합니다. 보통의 리스펙스 호출 (square (argument))은 square를 적용하기 전에 인자를 한 번 평가합니다. 명시적으로 쓴 normal-model 일정은 본문에서 x를 두 번 쓰므로 argument를 두 번 호출합니다. 두 일정은 모두 25를 반환하지만 호출 수가 다릅니다. 이 비교는 코드로 명시한 두 유한 일정과 정확한 호출 횟수를 기록합니다.
- 출력
- —
- 값
- —
- 진단
- —
축약 프로그램은 ((applicative (square (+ 2 3)) (square 5) (* 5 5) 25) (normal (square (+ 2 3)) (* (+ 2 3) (+ 2 3)) (* 5 5) 25))를 반환합니다. 일정 프로그램은 ((applicative 25 1) (normal-model 25 2))를 반환합니다.
첫 실행에서는 substitute가 x 두 곳을 따라가는 과정과 값 5로 바꾸는 경우와 식 (+ 2 3)으로 바꾸는 경우를 비교하세요. 두 번째 실행에서는 일반 프로시저 호출 안의 argument 적용 한 번과 명시적으로 쓴 normal-model 곱셈 안의 argument 적용 두 번을 찾으세요. 런타임 실행 흐름은 실제로 실행한 코드만 기록하며 인용된 축약 목록은 숨은 평가기 프레임이 아니라 설명용 데이터입니다.
프로그램을 수정하고 결과를 비교해 보세요.
본문 (+ (* x x) y)에서 x를 (+ 1 2)로, y를 4로 치환하고 적용적 경로와 정상 순서 경로를 데이터로 구성하세요. 축약 전에 (+ 1 2) 사본이 몇 개 생기는지 예상하세요.
힌트 보기
매개변수를 하나씩 치환하세요. x는 두 번 나오므로 정상 순서 본문에는 피연산자 식 사본이 두 개 생기고 y는 한 번 나옵니다.