예 :`let '에 의해 생성 된 로컬 변수의 상태는 재귀 호출 Scheme 동안 변경됩니까?
요소가 목록에 있는지 확인하고 싶습니다. 알고리즘은 간단하다, 나는 위의 C++ 코드와 유사 뭔가를 할 수 없어, 제도 나 단일 if
문을 사용하지 않기 때문에 이제 C++로
bool element_of(const std::vector<int>& lst, int elem) {
for(int i(0), ie = lst.size(); i < ie; ++i)
if(elem == lst[i])
return true;
return false;
}
그것을 할 수 있습니다. 그런 다음 임시 변수 인 result
을 찾았습니다. result
은 #f
의 초기 값을가집니다. 다음으로 재귀 적으로 목록의 다음 항목 즉, cdr lst
을 확인하는 함수를 호출합니다. 제 질문은 let
으로 만든 변수가 새로운 함수를 시작할 때마다 초기 값으로 복원됩니다. 통화 또는 그 값은 마지막 통화까지 동일하게 유지됩니까? fold
을 사용 한편
(define (element-of x lst)
(fold (lambda (elem result)
(if (eq? elem x) (or result #t) result))
#f
lst))
감사
감사합니다. 그래서 Scheme의 지역 변수의 메커니즘은 명령형 언어와 정확히 같습니다. – Chan
일종의 ... Scheme의 환경 모델은 Scheme이 "순수한"함수 언어가 아니기 때문에 필요합니다. 변수에 대한 가변성을 허용합니다. 기본적으로 모든 변수는 기본적으로 기호 테이블 인 "환경"에있는 기호입니다. '(a a b)'키워드는 기호'a'를 지역 환경 (기호 표)에 추가하고 평가 된 값'b'에 바인드합니다. 'a'에'define '을 다시 호출하면 새로운 환경에서 그것을 호출하지 않는 한'a'를 다른 것으로 다시 바인딩합니다.이 경우 심볼 테이블에 새로운'a'를 추가하여 이전 값. – Jason
Scheme의 환경 모델에 대한 자세한 내용은 다음 링크를 참조하십시오. http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer- programs-spring-2005/lecture-notes/lecture15webhan.pdf – Jason