web-dev-qa-db-ja.com

clojure / clojurescriptのプライベートdef

Clojureとclojurescriptでは、defn-と呼ばれるプライベートバージョンのdefnを使用できますが、def-が含まれていないように見えるので、defでも同じようにできますか?

56
Zubair

:private trueメタデータキーと値のペアを追加する必要があります。

(def ^{:private true} some-var :value)
;; or
(def ^:private some-var :value)

2番目の形式は、最初の形式の省略形です。

79
juan.facorro

現在、ClojureScriptにプライベートdef(およびdefn)を含めることはできません: https://clojurescript.org/about/differences ( 「特別フォーム」の下)

コンパイルは失敗しませんが、defは引き続きアクセス可能です。

17
Mik

Def-が必要な場合は、次のように実装します。

(defmacro def- [item value]
  `(def ^{:private true} ~item ~value)
)
14

このGoogleグループ post には、このトピックに関する議論があります。どうやらリクエストが検討されているようです。回答の1つによると、defn-は良いアイデアではないと見なされ、defなどで永続化しないことにしました。

9
leeor

def-を実装する方法は次のとおりです。

(defmacro def-
  "same as def, yielding non-public def"
  [name & decls]
  (list* `def (with-meta name (assoc (meta name) :private true)) decls))

このコードは、defn-のコードと非常によく似ており、(clojure.repl/source defn-)を使用して検索できます。

(defmacro defn-
  "same as defn, yielding non-public def"
  {:added "1.0"}
  [name & decls]
  (list* `defn (with-meta name (assoc (meta name) :private true)) decls))
5
John