2012-11-26 2 views
17

여러 장소에서 단일 세그먼트 네임 스페이스가 클로저에서 사용되지 않도록 읽었습니다.단일 세그먼트 네임 스페이스에 어떤 문제가 있습니까?

실제로 본 대부분의 라이브러리에는 (require 'lib'대신) 'lib.core가 필요합니다.

왜?


편집 : 나는 아주 어리 석다. 단일 세그먼트 네임 스페이스가 나쁜 것일 수 있다는 간결한 예를 들어 볼 수 있습니다.

답변

14

Java는 다른 패키지에서 아무것도 참조 할 수 없기 때문에 Java는 기본 패키지의 사용을 권장하지 않습니다. one-segment Clojure 네임 스페이스를 미리 컴파일하면 기본 패키지에 Java 클래스가 생깁니다. 누구든지 Java에서 라이브러리를 사용하고 싶다면이 사소한 일로 인해 죽지 않을 것입니다. 단일 세그먼트 네임 스페이스를 사용하는 데 좋은 이유가 없기 때문에 잘 정의 된 이유가 없으므로 Clojure에서 단일 세그먼트 네임 스페이스가 권장되지 않는다고 말하는 것이 합리적입니다.

+0

ok, doom.clj -> doom.class하지만 horror/doom.clj의 (ns horror.doom)은 package horror의 doom.class로 이동합니까? 그리고 (ns horror.doom)을 사용하려면 서브 디렉토리 공포가 있어야만합니까? –

+2

예, Clojure가 네임 스페이스를 기반으로 .clj 파일을 자동으로 찾습니다. –

6

단일 세그먼트 네임 스페이스에는 Java interop에 문제가 있습니다. 예기치 않은 상황이 발생할 수 있습니다. 참고 https://groups.google.com/forum/?fromgroups=#!topic/clojure/gOffhotk25Y

+0

나는 그것을 읽고 아직도 무슨 일이 일어나고 있는지 잘 모르겠다. 내가 번역 할 수있는 최선의 방법은 '저주받은 자바 낙태가 클로저에 흘러 들어가는 것이지만, 실제로 어떻게 악화 될 수 있는지는 분명치 않다.' 어쨌든 고마워. –

+2

JVM의 clojure에서,'(ns foo.bar)'는 * package * foo의 * class * bar를 생성하고 bar의 내부 클래스로서 bar에 정의 된 함수를 사용한다. 이것은 clojure의 "최상위"네임 스페이스가 실제로 "패키지가없는"클래스이며 JVM 및/또는 Java에서 특수하게 (예기치 않은 일부 방식으로) 처리된다는 것을 의미합니다. –

관련 문제