我想在Clojure中创建一个只能从当前命名空间中看到的类型。
在my-type
my.ns
类型
(ns my.ns)
(deftype my-type
Protocol
(some-function[]))
如何避免通常的导入策略,将类型设为私有?
(ns other.ns
(:import my.ns.my-type)
(->my-type)
答案 0 :(得分:1)
您无法阻止导入类型,因为它们只是公共类。您可以像这样将工厂函数设为私有:
(deftype Foo [])
(alter-meta! #'->Foo assoc :private true)
对于完全隐藏的“类型”,您可以在私有工厂函数中使用reify
:
(defn ^:private make-foo [& args]
(reify SomeProtocol
(method1 [this] ...)))
这里的一个潜在问题是你将无法使用extend-type
和类似的来增强这种“类型”。
(defprotocol ^:private PFoo
(^:private foo [this]))
协议Var和各个方法都需要 :private
元数据,因为它们会收到自己独立的Vars。完成上述操作后,界面some.ns.PFoo
仍然是公开的,但协议some.ns/PFoo
不会公开。