728x90
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 을 사용한다.
728x90
'프로그래밍 Programming' 카테고리의 다른 글
클로저 10. 함수 만들기 - 이름공간에서 심볼 관리 (1) (0) | 2018.08.18 |
---|---|
클로저 09. 함수 만들기 - defn, fn, 그리고 무명함수 (0) | 2018.08.18 |
클로저 07. 데이터 컬렉션 - 리스트가 핵심 (0) | 2018.08.17 |
클로저 06. 데이터 컬렉션 - 집합 (0) | 2018.08.17 |
클로저 05. 데이터 컬렉션 - 맵 (0) | 2018.08.17 |