Clojure 네임 스페이스를 여러 파일로 분할


91

?로 사전 컴파일을 수행 할 때 여러 소스 파일에 걸쳐 Clojure 네임 스페이스를 분할 할 수 :gen-class있습니까? 어떻게 (:main true)하고 (defn- ...)활동하기 시작?

답변:


137

개요

확실히 당신은 할 수 있습니다. 사실 clojure.core네임 스페이스 자체는 이런 방식으로 분리되어 있으며 다음을 살펴보면서 따라갈 수있는 좋은 모델을 제공합니다 src/clj/clojure.

core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..

이러한 모든 파일이 참여하여 단일 clojure.core네임 스페이스 를 구축합니다 .

기본 파일

이들 중 하나는 네임 스페이스 이름과 일치하도록 이름이 지정된 기본 파일로, 누군가가 :use또는 에서 언급 할 때 찾을 수 있도록합니다 :require. 이 경우 기본 파일은 clojure/core.clj이고 ns양식으로 시작 합니다. 여기에 필요한 다른 파일에 관계없이 모든 네임 스페이스 구성을 넣어야 합니다. 여기에는 일반적으로 다음 :gen-class과 같은 내용도 포함 됩니다.

(ns my.lib.of.excellence
  (:use [clojure.java.io :as io :only [reader]])
  (:gen-class :main true))

그런 다음 기본 파일의 적절한 위치 (가장 일반적으로 모두 끝 부분) load에서 도우미 파일을 가져옵니다. 에서 clojure.core그것은 다음과 같습니다 :

(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")

접두사로 현재 디렉터리가 필요하지 않으며 .clj접미사 가 필요하지 않습니다 .

도우미 파일

각 도우미 파일은 도움이되는 네임 스페이스를 선언하는 것으로 시작해야하지만 in-ns함수를 사용하여 그렇게해야 합니다. 따라서 위의 예제 네임 스페이스의 경우 도우미 파일은 모두 다음으로 시작됩니다.

(in-ns 'my.lib.of.excellence)

그게 전부입니다.

세대 급

이러한 모든 파일이 단일 네임 스페이스를 빌드하기 때문에 정의하는 각 함수는 기본 또는 도우미 파일에있을 수 있습니다. 이것은 물론 gen-class원하는 파일에서 함수를 정의 할 수 있음을 의미합니다 .

(defn -main [& args]
  ...)

Clojure의 일반적인 정의 순서 규칙은 여전히 ​​모든 함수에 적용되므로 해당 함수 를 사용 하기 전에 함수를 정의 하는 파일 이로드 되었는지 확인해야 합니다.

개인 변수

또한 (defn- foo ...)네임 스페이스-개인 기능을 정의하는 양식 에 대해서도 질문했습니다 . 이와 같이 정의 된 함수와 다른 :private변수는 정의 된 네임 스페이스 내에서 볼 수 있으므로 기본 및 모든 헬퍼 파일은 지금까지로드 된 모든 파일에 정의 된 개인 변수에 액세스 할 수 있습니다.


3
아주 훌륭하고 완전한 답변입니다! BTW, 나는 Clojure의 기쁨을 통해 첫 번째 패스를 거의 마쳤습니다 . 멋진 책!
Ralph

이 답변을 공유해 주셔서 감사합니다. 2 년 후에도 여전히 좋은 관행으로 간주됩니까? (나는 상황이 빠르게 변한다는 것을 알고 있습니다.) Clojure 자체가 여전히이 기술을 사용하고 있음을 알고 있습니다.
David J.

9
현재로서는 여러 파일이 단일 네임 스페이스를 생성하도록하려는 경우 여전히 모범 사례입니다. 그러나 그 자체는 지금보다 덜 일반적 일 수 있습니다. 대안은 ns의 모든 공용 변수를 단일 파일에 정의하고 모든 도우미 변수 및 함수를 별도의 "구현"네임 스페이스로 이동하는 것입니다. impl의 vars는 기술적으로 공개되지만 문서화 된 API의 일부가 아님을 나타내는 ns 독 스트링은 일반적이며 충분해야합니다.
Chouser 2013 년

1
일반적인 Clojure 도구가 다중 파일 네임 스페이스를 이해하는 데 문제가 있는지 알고 있습니까? 린? 신병? 사과주? nREPL? 키빗? 이스트우드? 클로버 라지? 기타 ...
Didier A.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.