좋습니다. 이것은 기본적인 질문입니다. SICP 비디오를 따르고 있는데, define
, let
및 set!
의 차이점에 대해 다소 혼란 스럽습니다.정의, 설정 및 설정의 차이점!
1) 비디오의 Sussman에 따르면 define
은 한 번만 값을 지정할 수 있습니다 (REPL에있는 경우 제외). 특히 줄에 2 개의 정의가 허용되지 않습니다. 그러나 Guile은이 코드를 행복하게 실행합니다.
(define a 1)
(define a 2)
(write a)
예상대로 2를 출력합니다. 나는이 수행하려고 할 경우 때문에 상황이 조금 더 복잡하다 (편집 : 위의 정의 후)
(define a (1+ a))
나는 오류가 발생,
(set! a (1+ a))
이 허용된다. 여전히 나는 이것이 set!
과 define
사이의 유일한 차이라고 생각하지 않습니다. 그게 무엇입니까?
2) define
과 let
의 차이는 나를 더욱 괴롭힌다. 나는 이론적으로 let
이 로컬 범위의 변수를 바인딩하는 데 사용된다는 것을 알고 있습니다. 그럼에도 불구하고,이 내가
(define (f x)
(let ((a 1))
(+ a x)))
(define (g x)
(define a 1)
(+ a x))
및 f
및 g
일 같은으로 대체 할 수 있습니다 예를 들어, define
와 동일하게 작동 나에게 보인다 특히 변수 a
외부 언 바운드입니다 g
도 있습니다.
이 유용한 점을 알 수있는 유일한 방법은 let
이 전체 함수 정의보다 짧은 범위를 가질 수 있다는 것입니다. 여전히 그것은 필요한 범위를 생성하기 위해 익명의 함수를 추가 할 수 있으며 자바 스크립트 에서처럼 익명의 함수를 추가하여 바로 호출 할 수 있습니다. 그렇다면 let
의 실제 이점은 무엇입니까?
당신이해야 제대로 들여 쓰기'(+ A X)'f''의 정의, 그것은 let''의 범위 내에서의로. –
당신이 맞아요, 고마워요 – Andrea
그것은 당신이 사용하는 체계 체계에 달려 있습니다. – knivil