갈루아의 반서재

def 는 값에 이름을 줘서 참조 가능하게 한다. 심볼에 직접 값을 바인딩하지 않고 var 를 통해서 한다.

예를 통해 살펴보자. 

1
2
3
4
5
 
user=> (def developer "Alice")
#'user/developer
user=>
 
cs

def 는 위에서 보는 바와 같이 이름공간 user 에 심볼인 developer 를 위한 var 객체를 만들었다.

이제 REPL 에서 developer 을 평가하면 "Alice" 로 평가된다. 

심볼 앞에 / 를 붙여서 이름공간을 지정할 수도 있다. 즉, var 의 완전한 이름은 이름공간/var의 이름인 셈이다.

하지만 여기서는 현재의 이름공간이 var 의 이름공간과 같기 때문에 developer 만 사용한 것이다. 

1
2
3
4
5
 
user=> (def user/developer "Alice")
#'user/developer
user=>
 
cs


하지만 다음 2가지 문제가 존재한다ㅏ.

  • 모든 값에 대해 전역적인 var 를 만들고 싶지 않다. 
  • 임시의 var 를 만들고 싶은 경우 (특정 계산을 위해 developer 라는 이름을 또 다른 var 에 설정하고 싶지만, 기존 값은 바꾸고 싶지 않은 경우)

이 경우 let 을 사용하면 된다. let 을 사용하면 let 영역 안에서만 사용되는 심볼에 값을 바인딩할 수 있다. 
let 에서 심볼 developer 에 바인딩을 "Alice in Wonderland" 로 바꿔보자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
 
user=> (def developer "Alice")
#'user/developer
user=>
 
user=> (let [developer "Alice in Wonderland"] developer)
"Alice in Wonderland"
user=>
 
user=> developer
"Alice"
user=>
 
cs

let 바인딩은 벡터 안에서 심볼과 값의 쌍들로 구성된다. 

let 안에서 일어나는 일은 let 안에서만 유효하다.


결론적으로, 

  • 전역 var 를 만들기 위해서는 def 를 사용한다. 
  • 지역 바인딩을 만들기 위해서는 let 을 사용한다.