如何在Clojure中公开我的命名空间的一些函数?

如何在Clojure中公开我的命名空间的一些函数?,clojure,functional-programming,Clojure,Functional Programming,我有以下代码: (ns mylib-clojure.core) (defn foo2 [x] (inc x)) (defn foo1 [x] (foo2 x)) 函数foo2仅在foo1内部使用。比方说,我不想公开函数foo2,所以我为命名空间的用户提供了一个较小的API。是否可以将foo2“私有”您可以将foo2声明为: 它在mylib clojure.core的外部将不可见。可以找到defn-的文档。另一个选项是在foo1中声明它: (defn foo1 [x] (let

我有以下代码:

(ns mylib-clojure.core)

(defn foo2 [x]
  (inc x))

(defn foo1 [x]
  (foo2 x))
函数
foo2
仅在
foo1
内部使用。比方说,我不想公开函数
foo2
,所以我为命名空间的用户提供了一个较小的API。是否可以将
foo2
“私有”

您可以将foo2声明为:

它在mylib clojure.core的外部将不可见。可以找到
defn-
的文档。另一个选项是在
foo1
中声明它:

(defn foo1 [x]
  (let [foo2 (fn [x] (inc x))]
    (foo2 x)))

在defn之后的hifen使它成为私有的?这正是我要找的!可能值得注意的是,标记为private的函数仍然可以通过完全限定该函数来访问。与Java中的private不同,clojure iis中的private更像是一个协议,即请不要直接使用它,但以防您确实需要它,并且您知道您可以做什么。@TimX这不完全正确。仅引用“private”函数
bar
就会导致
CompilerException java.lang.IllegalStateException:var:#'a/bar不是公共的
。也许有一些黑客的方法来检索它,但同时在Java中,您可以使用反射来调用私有方法。关键是这些私有构造原则上不禁止范围外的使用-这是相当正常的使用边界。@Jarlax它没有那么粗糙-只是完全限定它,即(#'a/bar)。您甚至可以执行(def bar#'a/bar),然后直接调用(bar)。虽然您可以使用reflections api访问Java中的私有函数,但这比完全限定名称要困难得多。
(defn foo1 [x]
  (let [foo2 (fn [x] (inc x))]
    (foo2 x)))