5

1つの名前空間にいくつかのプライベート関数があり、2番目の名前空間に含めたいと思います。例えば

(ns one)

(defn ^:private foo 
  "A docstring"
  [x] (* x 2))

そして、2番目の名前空間はこれに対するエイリアスを作成する必要があります。

(ns two)

(def foo ???)

(foo 3)   ;; should work as if the function in namespace one was called
=> 6

理想的には、docstringを保存したいので、2か所で維持する必要はありません。また、同じ名前を使用するか、別の名前を使用するかを選択できるようにしたいと思います。

この要件の理由は次のとおりです。機能は名前空間で必要/使用されますoneoneはの依存関係でありtwo、循環依存関係を持つことができないため、それ自体fooの中で定義することはできませんtwotwoはパブリックAPIであるため、名前空間fooのパブリックな部分である必要があります。two

これを達成するための最良の方法は何ですか?

4

2 に答える 2

5

これはどう:

(ns one)

(defn- foo 
  "A docstring"
  [x] (* x 2))

(ns two)

(def foo-alias #'one/foo)
(alter-meta! #'foo-alias merge (select-keys (meta #'one/foo) [:doc :arglists]))

秘訣は、シンボル'one / fooを解決しないことです。したがって、メタデータでプライベートフラグをトリガーしないようにします。次に、2番目の名前空間でfooのエイリアスを作成した後、前の定義から保持するメタデータを選択するだけです。

于 2012-10-28T15:31:04.413 に答える
0

ポチョムキンライブラリーには、import-varsこの種の機能があります。

https://github.com/ztellman/potemkin

于 2014-02-21T14:41:29.473 に答える