Re: why a defn- but not a def- ?

2009-11-14 Thread Albert Cardona
On Fri, Nov 13, 2009 at 11:26 PM, Mike Hogye stacktra...@gmail.com wrote:
 Why is there an easy way to def a private function (defn-), but no
 similarly easy way to def an arbitrary var as private?


The way I see it, def- would encourage gratuitous variable declaration
imperative style.

By private var what one means is a local variable.

If you want a private variable use a let binding:

(let [my-private-var Something not to be shared]
  (defn my-public-fn
Do something
[a b]
(str a b my-private-var)))

If you need the private variable to be mutable, use a ref and dosync
changes on it. That goes a long way towards correctness.

Albert
--
http://albert.rierol.net

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en


Re: why a defn- but not a def- ?

2009-11-14 Thread John Harrop
On Sat, Nov 14, 2009 at 8:55 AM, Albert Cardona sapri...@gmail.com wrote:

 On Fri, Nov 13, 2009 at 11:26 PM, Mike Hogye stacktra...@gmail.com
 wrote:
  Why is there an easy way to def a private function (defn-), but no
  similarly easy way to def an arbitrary var as private?


 The way I see it, def- would encourage gratuitous variable declaration
 imperative style.

 By private var what one means is a local variable.

 If you want a private variable use a let binding:

 (let [my-private-var Something not to be shared]
  (defn my-public-fn
Do something
[a b]
(str a b my-private-var)))

 If you need the private variable to be mutable, use a ref and dosync
 changes on it. That goes a long way towards correctness.


I find top-level lets to be messy compared to defining global constants like
this:

(def +the-constant+ value)

There's a defvar that adds docstring capability to def, and a private-making
version defvar-, in clojure.contrib.def.

My own style preference would be to put important constants in defs at the
top of the file, rather than use let or (worse) embed magic numbers or the
like in individual functions that might need to be tweaked. Constants that
are truly constant because they're forced to be by math, the algorithm used,
or whatever might be locally letted in the function that uses them, to name
them while keeping them with the rest of the algorithm, though.

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en