On Mon, Jan 24, 2011 at 8:42 PM, Nick Brown <[email protected]> wrote:
> Ugly? Aww, I thought the ^ metadata looked kinda cute...
>
> It is a bit awkward that defn- exists and not def-, but it seems defs
> are not going to be as common as defns (though I'll admit I haven't
> written or read enough complex idiomatic Clojure code to know for
> sure). And if you really want to be consistent you would probably
> also want defmulti-, defmacro-, defstruct-, defprotocol-, etc. And
> I'll have to stop using tiny fonts to read Clojure code so I can tell
> if something is private or not.
>
> If we really wanted to make it easy to write private functions,
> variables, etc, I would personally prefer a macro like (private) for
> which all forms inside would be made private. Like
> (private
> (def my-private-foo (...))
> (defn my-private-bar [] (...)))
>
> Not only does that seem more clear, it would encourage the private
> stuff to be separate from public stuff.
First stab at it:
(defmacro private [& forms]
(apply list 'do
(map
(fn [form]
(cond
(not (coll? form)) form
(or (vector? form) (map? form) (set? form)) form
(< (count form) 2) form
:else
(let [[d n & r] form]
(cond
(not (symbol? d)) form
(not (symbol? n)) form
(not (.startsWith (str d) "def")) form
:else (apply list d (vary-meta n assoc :private true) r)))))
forms)))
It seems to work. It just outputs all the enclosed forms in a "do",
except for those that start (defsomething somesymbol ...), where it
vary-metas a :private true onto somesymbol. So, the form must start
with two symbols and the first symbol must start with "def".
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en