Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 392
Jason Baker Avatar asked Mar 08 '09 00:03

Jason Baker


People also ask

What does let mean in Clojure?

Sign up. Clojure let is used to define new variables in a local scope. These local variables give names to values. In Clojure, they cannot be re-assigned, so we call them immutable.

What is def Clojure?

def is a special form that associates a symbol (x) in the current namespace with a value (7). This linkage is called a var . In most actual Clojure code, vars should refer to either a constant value or a function, but it's common to define and re-define them for convenience when working at the REPL.

Does Clojure have closures?

This is a perfect opportunity to enforce encapsulation to avoid drowning the client in board-implementation details. Clojure has closures, and closures are an excellent way to group functions (Crockford 2008) with their supporting data.


1 Answers

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.

like image 139
Rayne Avatar answered Oct 11 '22 09:10

Rayne