On Wed, May 28, 2014 at 12:56:43AM -0700, sorin cristea wrote: 
> *( defn some-method    [arg]   (def thred (. Thread currentThred)   
> (println "on current thread" thread "use variable" arg))*
> 
>  'thred' - is only visible inside of some-methd, because is a little 
> confuse for me your statement - "*`def` and `defn` create global bindings - 
> they are not variable assignments - and you don't want `def` nested into 
> `defn`.*  "

In this case your "thred" var is actually visible globally, not only in
the function.

For example:

  user=> (defn a-function [arg]
    #_=>   (def b (+ arg 1))
    #_=>   (/ b 2))
  #'user/a-function
  user=> (a-function 1)
  1
  user=> b
  2
  user=> (a-function 3)
  2
  user=> b
  4
  user=> (a-function 111)
  56
  user=> b
  112

See how the value for "b" keeps changing? It's because "a-function" is
changing the *global* "b" value.

Let's try with another function, using "let" instead:

  user=> (defn another-function [arg]
    #_=>   (let [barg (+ arg 1)]
    #_=>     (/ barg 2)))
  #'user/another-function
  user=> (another-function 1)
  1
  user=> barg

  CompilerException java.lang.RuntimeException: Unable to resolve symbol: barg 
in this context, compiling:(NO_SOURCE_PATH:0:0) 
  user=> (another-function 3)
  2
  user=> barg

  CompilerException java.lang.RuntimeException: Unable to resolve symbol: barg 
in this context, compiling:(NO_SOURCE_PATH:0:0) 
  user=> (another-function 111)
  56
  user=> barg

  CompilerException java.lang.RuntimeException: Unable to resolve symbol: barg 
in this context, compiling:(NO_SOURCE_PATH:0:0) 

Here you can see that the local variable in the let, "barg" doesn't
escape to the global scope. In fact, there is no global "barg" variable
at all! It's completely contained within "another-function" now.

This is why we use "let" instead of "def". "def" creates a *global* var,
which is then in the global scope. "let" allows us to introduce our own
bindings for values within the current lexical scope. (There are some
other differences between them, but this is the strongest argument for
using "let" over "def", I think.)

Carlo

Attachment: signature.asc
Description: Digital signature

Reply via email to