모든 예는 SICP 책에서 발췌 :클로저에 중첩 된 정의 문 (스키마와 같은)을 작성하는 표준 방법은 무엇입니까?
이 http://sicpinclojure.com/?q=sicp/1-3-3-procedures-general-methods은 LISP에 MIT 비디오 시리즈에서 동기가되었다 - 계획에서 http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/video-lectures/2a-higher-order-procedures/
, 다른 '정의'안에 넣어 '정의'할 수
(defn close-enough? [v1 v2]
(let [tolerance 0.00001]
(< (Math/abs (- v1 v2))
tolerance)))
: Clojure의에서
(define (close-enough? v1 v2)
(define tolerance 0.00001)
(< (abs (- v1 v2)) tolerance))
는 그것이 중첩되는 유일한 차이점과 문을 '하자'가있다 0
그러나이 같은 큰 Clojure의 무언가 재 작성에 대한 최신
(define (sqrt x)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(define tolerance 0.00001)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
(fixed-point (lambda (y) (average y (/ x y)))
1.0))
이 사실 일을 수행하지만 매우 파격적인 모습 ...
(defn sqrt [n]
(let [precision 10e-6
abs #(if (< % 0) (- %) %)
close-enough? #(-> (- %1 %2) abs (< precision))
averaged-func #(/ (+ (/ n %) %) 2)
fixed-point (fn [f start]
(loop [old start
new (f start)]
(if (close-enough? old new)
new
(recur new (f new)))))]
(fixed-point averaged-func 1)))
(sqrt 10)
월을? : 무엇을/
/2012 (8)답변 해 주셔서 감사합니다.
기본적으로 'letfn'은 'let'과 크게 다르지 않습니다 - 호출되는 함수는 'letfn'정의에 중첩되어야합니다 (Scheme과는 반대로 함수는 정의 후에 다음 sexp에서 사용되며 정의 된 최상위 레벨 기능의 범위 내에 존재 함).
또 다른 질문은 ... 왜 어떤 계획을 수행하는 능력을 부여하지 않는가? 그것은 일종의 언어 디자인 결정입니까? 내가 계획 조직에 대해 좋아하는 것은 :
1) 아이디어의 캡슐화 그래서 프로그래머로 작은 블록이 활용되고있는 것을 더 큰 블록에 같은 생각을 가지고 - 나는 단지 조금 사용하고, 특히 작은 블록이 큰 블록 내에서 한 번 차단됩니다 (작은 블록이 그 자체로 유용하더라도).
2) 이것은 최종 사용자에게 유용하지 않은 거의 절차없이 네임 스페이스를 오염시키지 않습니다. (clojure 프로그램을 작성하고 일주일 후에 다시 돌아 왔으며 코드를 다시 배워야했습니다. 편평한 구조에서 그리고 나는 위로 아래로 방법에서와 반대로 나가 안쪽으로 부호를 안으로보고 있었다는 것을 느꼈다.
3) 일반적인 메소드 정의 인터페이스에서 특정 하위 메소드를 추출하고 테스트하지 않고 들여 쓰기하여 변경된 버전을 붙여 넣을 수 있습니다.
왜 이것을 클로저에 구현하지 않습니까?
흥미로운 질문이지만 나는 모든 것을 하나의 기능에 넣으려고 할 것이라고 생각하지 않습니다. – Kevin