나는 차이가합니다 (인위적인 예를 들어 죄송합니다) 사이에 이해하지 않습니다로컬 바인딩을 만들기위한 'let'또는 'letrec'과 'define'의 차이점은 무엇입니까?
(define average
(lambda (elems)
(define length
(lambda (xs)
(if (null? xs)
0
(+ 1 (length (cdr xs))))))
(define sum
(lambda (xs)
(if (null? xs)
0
(+ (car xs) (sum (cdr xs))))))
(define total (sum elems))
(define count (length elems))
(/ total count)))
및
(define average
(lambda (elems)
(letrec ((length
(lambda (xs)
(if (null? xs)
0
(+ 1 (length (cdr xs))))))
(sum
(lambda (xs)
(if (null? xs)
0
(+ (car xs) (sum (cdr xs))))))
(total (sum elems))
(count (length elems)))
(/ total count))))
를 지금까지 내가 말할 수있는, 그들 모두는 새로운 범위를 만들고, 그 범위 내에서 서로를 참조하고 몸을 평가하고 반환하는 4 개의 지역 변수를 만듭니다.
여기에 뭔가가 누락 되었습니까? letrec
은 (는) define
입니까?
구현에 따라 다를 수 있습니다. 나는 Lisps의 기초를 이해하려고 노력하고있다.
엄밀히 말하면, '길이'와 '합'은 * 묶여 * (위치에) 보장됩니다; 보장되지 않는 것은 그들이 초기화 값을 할당 받았다는 것이다. R5RS - R7RS는 'total'과 'count'에 대한 초기화 절에서 이러한 값을 참조하는 것이 "오류"라고합니다. (그러나이 구현에 대해서는이 오류를 감지하고 불평 할 필요가 없다고 생각합니다.) 차이점에 대한 자세한 내용은'letrec' /'letrec *'을 참조하십시오. http://stackoverflow.com/q/13078165/272427 – dubiousjim