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.