2014-02-07 28 views
2

假設我們有一個命名空間項目:proj.foo,proj.bar,proj.baz。由於我們在proj的範圍內,因此我們想要訪問foo/foo前綴不爲,而不是proj.foo/foo。爲此,您可以用ns但它冗長:`需要`子命名空間:作爲Clojure的簡寫?

(ns proj.qux 
    (:require (proj 
       [foo :as foo] 
       [bar :as bar] 
       [baz :as baz]))) 

有沒有做到這一點的簡便方法?這似乎是一個普遍的任務。

回答

1

我們可以構造你想要使用的功能alias

(defn common-alias [ns-symbol] 
    (alias ((comp symbol 
       #(re-find #"[^.]+$" %) 
       name) 
      ns-symbol) 
     ns-symbol)) 

用作這樣:

user> string/join 
CompilerException java.lang.RuntimeException: No such namespace: string, compiling:(NO_SOURCE_PATH:1:764) 
user> (common-alias 'clojure.string) 
nil 
user> string/join 
#<string$join [email protected]> 
-1

一對夫婦的選擇這裏:

(ns proj.qux 
    (:require [proj [foo :refer :all] [bar :refer :all]])) 

這將允許您使用所有公共瓦爾從proj.foo等前綴的,但你必須確保有可真不是個名稱衝突瓦特/這些命名空間中的符號。

(ns proj) 

(load "proj/foo") 
(load "proj/bar") 
(load "proj/baz") 

這也可以讓你指的這些文件中定義的無前綴瓦爾,但也許不是你追求的:這種方法從字面上包含三個文件到主proj納秒,但是foobarbaz在這種情況下技術上不是名稱空間。您只需使用不同的文件即可構建單個ns proj。每所包括的文件應該有沒有(ns ...)形式和上面的例子假設該文件夾結構(請注意,您沒有爲(load ...)指定.clj擴展名):

src 
|- proj.clj 
|- proj 
    |- foo.clj 
    |- bar.clj 
    |- baz.clj 
+1

請問爲什麼會得到downvoted?我解釋說它可能不是OP之後的事情,但請提供更多細節/背景...... thx! – toxi

+0

我沒有downvote,但我不認爲這是相當習慣。此外,它將foo/bar/baz中的所有內容放入* current *命名空間 - 它修改了當前的命名空間。我剛纔問的是隻給他們其他命名空間較短的命名空間名稱,但仍將它們保存在單獨的命名空間中。 – elliot42