İle önceden derleme yaparken bir Clojure ad alanını birden çok kaynak dosyaya bölmek mümkün müdür :gen-class
? Nasıl oynanır (:main true)
ve (defn- ...)
devreye girer?
Yanıtlar:
Kesinlikle yapabilirsiniz, aslında clojure.core
ad alanının kendisi bu şekilde bölünmüştür ve içine bakarak takip edebileceğiniz iyi bir model sağlar src/clj/clojure
:
core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..
Tüm bu dosyalar, tek clojure.core
ad alanını oluşturmak için katılır .
Bunlardan biri, ad alanı adıyla eşleşecek şekilde adlandırılan birincil dosyadır, böylece birisi bir :use
veya içinde ondan bahsettiğinde bulunacaktır :require
. Bu durumda ana dosya olur clojure/core.clj
ve bir ns
formla başlar . Bu, diğer dosyalarınızın hangisine ihtiyaç duyduğuna bakılmaksızın, tüm ad alanı yapılandırmanızı koymanız gereken yerdir . Bu, normalde aşağıdakileri :gen-class
de içerir , yani aşağıdaki gibi bir şey
(ns my.lib.of.excellence
(:use [clojure.java.io :as io :only [reader]])
(:gen-class :main true))
Daha sonra, birincil dosyanızın uygun yerlerinde (en yaygın olarak tümü sonunda) load
yardımcı dosyalarınızı getirmek için kullanın . Şöyle clojure.core
görünüyor:
(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")
Önek olarak geçerli dizine veya .clj
son eke ihtiyacınız olmadığını unutmayın .
Yardımcı dosyaların her biri, yardım ettikleri ad alanını bildirerek başlamalı, ancak bunu in-ns
işlevi kullanarak yapmalıdır . Dolayısıyla, yukarıdaki örnek ad alanı için yardımcı dosyaların tümü şununla başlar:
(in-ns 'my.lib.of.excellence)
Tüm gereken bu.
Tüm bu dosyalar tek bir ad alanı oluşturduğundan, tanımladığınız her işlev birincil veya yardımcı dosyalardan herhangi birinde olabilir. Bu, elbette, istediğiniz gen-class
herhangi bir dosyada işlevlerinizi tanımlayabileceğiniz anlamına gelir :
(defn -main [& args]
...)
Clojure'un normal tanımlama sırası kurallarının hala tüm işlevler için geçerli olduğuna dikkat edin, bu nedenle, o işlevi kullanmaya çalışmadan önce , bir işlevi tanımlayan dosya ne olursa olsun , yüklendiğinden emin olmanız gerekir .
Ayrıca (defn- foo ...)
bir ad-alanı-özel işlevi tanımlayan formu da sordunuz . Bunun gibi tanımlanan işlevler ve diğer :private
değişkenler, tanımlandıkları ad alanı içinden görülebilir, bu nedenle birincil ve tüm yardımcı dosyalar, şimdiye kadar yüklenen dosyalardan herhangi birinde tanımlanan özel değişkenlere erişebilir.