2013-04-06 42 views
3

我想創建一個只能從當前命名空間可見的Clojure類型。如何在Clojure中創建一個本地類型?

具有A型my-typemy.ns

(ns my.ns) 

(deftype my-type 
    Protocol 
    (some-function[])) 

定義如何避免常見的進口戰略,使得私營類型?

(ns other.ns 
    (:import my.ns.my-type) 

(->my-type) 

回答

1

你不能阻止你的類型被導入,因爲它們只是公共類。可以使工廠職能私人像這樣:

(deftype Foo []) 

(alter-meta! #'->Foo assoc :private true) 

對於完全隱藏「類型」,你可以在一個私人工廠函數使用reify

(defn ^:private make-foo [& args] 
    (reify SomeProtocol 
    (method1 [this] ...))) 

這裏的一個潛在的問題是,你將無法使用extend-type及類似詞來擴充這種「類型」。

協議,在另一方面,可以由私人,需要提醒的是其附帶的接口仍然是公衆:需要雙方的協議,VAR和各個方法

(defprotocol ^:private PFoo 
    (^:private foo [this])) 

:private元數據,因爲他們收到他們自己的獨立變量。有了上面的介紹,接口some.ns.PFoo仍然是公開的,但協議some.ns/PFoo不會。

+0

關於協議的約定,但是不同的用例。類型與記錄類似,因爲它們都可以實現協議。我不想避免使用本地定義類型的(ab)外部人員,它不是IMO的接口事物。 – 2013-04-07 23:30:14