Search code examples
lispclojureletfunction

let vs def in clojure


I want to make a local instance of a Java Scanner class in a clojure program. Why does this not work:

; gives me:  count not supported on this type: Symbol 
(let s (new Scanner "a b c"))

but it will let me create a global instance like this:

(def s (new Scanner "a b c"))

I was under the impression that the only difference was scope, but apparently not. What is the difference between let and def?


Solution

  • The problem is that your use of let is wrong.

    let works like this:

    (let [identifier (expr)])
    

    So your example should be something like this:

    (let [s (Scanner. "a b c")]
      (exprs))
    

    You can only use the lexical bindings made with let within the scope of let (the opening and closing parens). Let just creates a set of lexical bindings. I use def for making a global binding and lets for binding something I want only in the scope of the let as it keeps things clean. They both have their uses.

    NOTE: (Class.) is the same as (new Class), it's just syntactic sugar.