add-watch
나는 클로저에 대해 많이 관심이 많다.
그런데 이 watch에 대해 제대로 알지는 못한다. 내가 아는 것은 watcher로 해당 원자값의 상태를 지속적으로 확인한다는 것이다. 그 시작은 watcher를 더하는 것으로 시작되는 것이다.
관찰(watch)는 인자 네 개를 받는 함수이다.
1. 키
2. 관찰되는 참조
3. 이전 상태
4. 새로운 상태
이것이다. 링크에 있는 첫번째 문장을 보자. Adds a watch function to an agent/atom/var/ref reference. The watch fn must be a fn of 4 args: a key, the reference, its old-state, its new-state.
일단 보면 모르겠는데 일단 이상한 보면 무슨 느낌인지 알 것이다.
(def at (atom 0))
#'fwpd.core/at
(add-watch at :watcher
(fn [key atom old-state new-state]
(println "The valueof the atom has been changed")
(println "key is " key)
(println "atom is " @atom)
(println "old-state is " old-state)
(println "new-state is " new-state)
(if (> new-state 10)
(println "TOO BIG!!!!!!")
(println "HAHA"))))
#object[clojure.lang.Atom 0x20788a98 {:status :ready, :val 0}]
자 아톰을 생성했다. 아톰이 뭔지 모른다고? 그냥 값이라고 생각하자. 그런데 아주 안전한 값이다. 그래서 단순히 값을 변경할 수 없다. 바꾸려면 특정 함수를 써야 하는데 그것은 swap! 이다. 중요하기 때문에 느낌표까지 붙어있다. 기억하자. 일단 실행해보겠다.
(swap! at inc)
The valueof the atom has been changed
key is :watcher
atom is 1
old-state is 0
new-state is 1
HAHA
1
;;10까지 올려보자
(swap! at inc)
The valueof the atom has been changed
key is :watcher
atom is 11
old-state is 10
new-state is 11
TOO BIG!!!!!!
11
무엇이 바뀌었는가??? HAHA 에서 TOO BIG!!!!!! 으로 바뀌었다. 바로 watcher가 이렇게 계속 관찰해서 반응한 것이다.
댓글 없음:
댓글 쓰기