yazz.com
yazz.com

Reputation: 58816

Private def in clojure/clojurescript

In Clojure and clojurescript you can have a private version of defn called defn-, but how do you do the same for def, as def- doesn't seem to be included?

Upvotes: 78

Views: 19146

Answers (5)

John
John

Reputation: 1467

Here's how to implement def-:

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

This code is very similar to that of defn-, which you can look up using (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))

Upvotes: 9

Mik
Mik

Reputation: 4187

It's worth mentioning, that currently it's not possible to have a private def (and defn) in ClojureScript: https://clojurescript.org/about/differences (under "special forms")

Compilation won't fail and but the def will stay accessible.

Upvotes: 19

leeor
leeor

Reputation: 17801

This google group post has a discussion about this topic. Apparently the request has been considered. According to one of the responses, defn- was deemed to not be a good idea and decided not to perpetuate it with def and others.

Upvotes: 10

Tom Parker-Shemilt
Tom Parker-Shemilt

Reputation: 1697

If you want a def-, here's how to implement it

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

Upvotes: 16

juan.facorro
juan.facorro

Reputation: 9930

You have to add the :private true metadata key value pair.

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

The second form is just a short-hand for the first one.

Upvotes: 113

Related Questions