?로 사전 컴파일을 수행 할 때 여러 소스 파일에 걸쳐 Clojure 네임 스페이스를 분할 할 수 :gen-class
있습니까? 어떻게 (:main true)
하고 (defn- ...)
활동하기 시작?
답변:
확실히 당신은 할 수 있습니다. 사실 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
변수는 정의 된 네임 스페이스 내에서 볼 수 있으므로 기본 및 모든 헬퍼 파일은 지금까지로드 된 모든 파일에 정의 된 개인 변수에 액세스 할 수 있습니다.