如何在Clojure中创建本地类型?

时间:2013-04-06 22:34:56

标签: clojure

我想在Clojure中创建一个只能从当前命名空间中看到的类型。

my-type

中定义了my.ns类型
(ns my.ns)

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

如何避免通常的导入策略,将类型设为私有?

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

(->my-type)

1 个答案:

答案 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不会公开。