Clojureとclojurescriptでは、defn-と呼ばれるプライベートバージョンのdefnを使用できますが、def-が含まれていないように見えるので、defでも同じようにできますか?
:private true
メタデータキーと値のペアを追加する必要があります。
(def ^{:private true} some-var :value)
;; or
(def ^:private some-var :value)
2番目の形式は、最初の形式の省略形です。
現在、ClojureScriptにプライベートdef
(およびdefn
)を含めることはできません: https://clojurescript.org/about/differences ( 「特別フォーム」の下)
コンパイルは失敗しませんが、def
は引き続きアクセス可能です。
Def-が必要な場合は、次のように実装します。
(defmacro def- [item value]
`(def ^{:private true} ~item ~value)
)
このGoogleグループ post には、このトピックに関する議論があります。どうやらリクエストが検討されているようです。回答の1つによると、defn-
は良いアイデアではないと見なされ、def
などで永続化しないことにしました。
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))