반응형
Clojure의 Let 대 바인딩
하나는 설정을 위해 작동 *compile-path*
하고 하나는 그렇지 않기 때문에 그것들이 다르다는 것을 이해합니다 . 그러나 그들이 왜 다른지에 대한 도움이 필요합니다.
let
주어진 바인딩으로 새 범위를 생성하지만 binding
...?
let
일부 값에 대해 어휘 범위의 불변 별칭을 만듭니다. binding
일부에 대한 동적 범위 바인딩을 만듭니다 Var
.
동적 바인딩은 binding
양식 내부의 코드와 해당 코드가 호출하는 모든 코드 (로컬 어휘 범위에 있지 않더라도)에 새 바인딩이 표시됨을 의미합니다.
주어진:
user> (def ^:dynamic x 0)
#'user/x
binding
실제로 a에 대한 동적 바인딩을 생성 Var
하지만 let
로컬 별칭을 사용하여 var에만 그림자를 적용합니다.
user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0
binding
Var
s에서 작동하므로 정규화 된 이름을 사용할 수 있으며 다음을 수행 let
할 수 없습니다.
user> (binding [user/x 1] (var-get #'x))
1
user> (let [user/x 1] (var-get #'x))
; Evaluation aborted.
;; Can't let qualified name: user/x
let
-도입 된 바인딩은 변경할 수 없습니다. binding
-도입 된 바인딩은 스레드 로컬에서 변경할 수 있습니다.
user> (binding [x 1] (set! x 2) x)
2
user> (let [x 1] (set! x 2) x)
; Evaluation aborted.
;; Invalid assignment target
어휘 및 동적 바인딩 :
user> (defn foo [] (println x))
#'user/foo
user> (binding [x 1] (foo))
1
nil
user> (let [x 1] (foo))
0
nil
let과 binding에 대한 또 다른 구문 차이 :
바인딩의 경우 모든 초기 값이 변수에 바인딩되기 전에 평가됩니다. 이는 후속 정의에서 이전 "별칭"의 값을 사용할 수있는 let과 다릅니다.
user=>(let [x 1 y (+ x 1)] (println y))
2
nil
user=>(def y 0)
user=>(binding [x 1 y (+ x 1)] (println y))
1
nil
binding
스레드 별 전역 환경에서 값을 이름에 바인딩합니다.
언급했듯이, 해당 let
바인딩에 대한 새 범위를 만듭니다.
참고 URL : https://stackoverflow.com/questions/1523240/let-vs-binding-in-clojure
반응형
'Programing' 카테고리의 다른 글
UTF8에서 STL 로의 와이드 문자 변환 (0) | 2020.11.08 |
---|---|
같은 페이지에서 다른 버전의 jQuery를 어떻게 실행합니까? (0) | 2020.11.08 |
인터프리터 / 컴파일러는 어떻게 작동합니까? (0) | 2020.11.08 |
언제 stdClass를 사용해야하고 언제 PHP oo 코드에서 배열을 사용해야합니까? (0) | 2020.11.08 |
Xcode : 헤더 복사 : 공개 vs. 비공개 vs. 프로젝트? (0) | 2020.11.08 |