"The Seasoned Schemer"의 16 장에서 저자는 '깊이 3'과 같이 n 목록에 중첩 된 피자를 반환하는 재귀 프로 시저 'depth'를 정의합니다. (((피자))). 그런 다음이를 "depthM"으로 향상 시키며, 이는 set을 사용하여 반환 값을 캐시합니다! 조회 테이블을 구성하는 Ns와 Rs 목록에서 이전에 보았던 반환 값에 도달하면 모든 과정을 반복하지 않아도됩니다. 예 : 이미 (depthM 8)을 계산했다면, 나중에 depthM 9를 계산할 때 (depthM 8)의 반환 값을 조회하고 null로 놓습니다 (depthM 0까지).스키마의 이전 반환 값 캐싱
그러나 Ns와 Rs를 프로 시저 내부로 옮기고 "let"으로 null로 초기화합니다. 왜 이것이 반환 값을 캐싱하지 못하게합니까? 약간의 실험에서, Ns와 Rs가 "depthM"에 대한 모든 호출에서 다시 초기화되는 것처럼 보입니다.
나는 그 점을 오해하고 있습니까?
내 질문에 정말 같아요 : 당신이 "상태"변수와 Perl 5.10에서 할 수있는 것처럼 어휘 범위 변수가 프로 시저 호출 사이에 그들의 값을 보존 할 수있는 방법이 있나요?
감사합니다. 나는 테스트 케이스와 비슷한 것을 썼지 만, 명시 적 람다를 생략했다. (정의 (foo) (...)) 구문론 설탕 (정의 foo (lamdba() (...))).하지만이 경우에는 작동하지 않습니다. lamdba가 클로저를 만들기 위해 내부에 있어야하기 때문에. – Brock
브록, 특정 권장 사항을 만들 수 있습니까? 이것은 나에게 혼란 스러웠습니다. Dirk이 위에서 쓴 글에 대한 퍼지적인 이해 -하지만이 섹션 3.2.3을 통해 어휘 범위와 환경의 근본적인 개념을 SICP에서 이해할 수있을 것입니다. 아마도 여러분은 그것으로부터 뭔가를 얻을 것입니다 : http : // mitpress .mit.edu/sicp/전체 텍스트/책/책 -ZH-21.html # % _ sec_3.2.3 – mquander