::는 클로저에서 무엇을 위해 사용됩니까?


83

Clojure의 키워드를 이해합니다 :keyword. 그러나 무엇을 위해 ::사용됩니까? 바인딩이있는 것처럼 보이는 이유는 무엇입니까?

user=> :foo
:foo
user=> ::foo
:user/foo

답변:


83

이중 콜론은 현재 네임 스페이스로 키워드를 완전히 한정 하기위한 것입니다. 이는 다른 라이브러리에 의미있는 키워드에 대한 이름 충돌을 방지하기위한 것입니다. 정규화 된 키워드가 없으면 실수로 맵의 일부 값을 덮어 쓰고 라이브러리와의 호환성이 깨질 수 있습니다.


제공된 이론적 근거에 관해서는, 왜 처음에 도서관이 그들을 위해 처리해야하는지도를 수정해야하는지 잘 모르겠습니다. 그것이 정말로 주된 동기라면, 약간의 설명이 도움이 될 수 있습니다.
matanster

3
한 가지 예 는 HTTP 요청을 설명하는 맵을 보강 할 수있는 미들웨어 (서블릿 필터와 유사) 일 수 있습니다. 네임 스페이스 키를 사용하면 링 앱에 구성된 다른 미들웨어와의 간섭에 대해 걱정하지 않고 추가 값을 추가하는 사용자 지정 미들웨어를 작성할 수 있습니다.
skuro

27

이제 기록으로 Clojure에 대한 뿐만 아니라 ClojureScript 위해 , ::키워드는 해결 네임 스페이스 별칭을 사용할 수 있습니다. 예를 들어 ::foo/bar:clojure.core/barif foo가의 별칭으로 평가됩니다 clojure.core. foo에서 네임 스페이스로 확인 되지 않으면 리더 예외가 발생합니다 .



또한 Clojure 1.9부터 is #:#::구문 이 관련 됩니다 . 여기에 설명 된대로 맵 과 함께 사용되어 맵 내의 키워드 를 확인 합니다 .
Joe Corneli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.