-
Notifications
You must be signed in to change notification settings - Fork 1
3. Dipping Your toes in the pool
Clojure REPL을 사용하면 처음 사용해보는 라이브러리도 즐거운 마음으로 확인해볼 수 있다.
-
화면에 픽셀을 표현하는 x, y 좌표를 가지는 시퀀스와 xor 연산을 해서 재미난 이미지를 만들어 보자
-
먼저 range 라는 함수를 가지고 좌표를 표현해보기 위해 range가 어떻게 동작하는지 확인해본다.
(range 5) ;=> (0 1 2 3 4)
-
x, y 좌표 쌍을 만들기 위해서 for를 사용해서 원하는 결과가 나오는지 실험해보자.
(for [x (range 2) y (range 2)] [x y]) ;=> ([0 0] [0 1] [1 0] [1 1])
-
xor 연산을 위해서 xor 함수같은 것이 있을 것으로 예상하고 REPL로 실험해보자.
(xor 1 2) ;=> java.lang.Exception: Unable to resolve symbol: xor in this context
-
xor라는 이름의 함수는 없다는 것을 알았다. 같은 기능을 하는 함수가 없는지 find-doc으로 찾아본다.
(find-doc "xor") ; ------------------------- ; clojure.core/bit-xor ; ([x y]) ([x y & more]) ; Bitwise exclusive or ;=> nil
-
bit-xor라는 함수가 같은 기능을 함수라는 것을 알게되었고 REPL에서 확인해보자.
(bit-xor 1 2) ;=> 3
-
이제 먼저 만들었던 x, y 쌍을 주는 for문에 xor 값을 추가해보자. REPL에서 UP키를 누르면 이전에 실행했던 구문을 불러올 수 있다.
(for [x (range 2) y (range 2)] [x y (bit-xor x y)]) ;=> ([0 0 0] [0 1 1] [1 0 1] [1 1 0])
-
잘 된것 같으니 이제까지 만들었던 것을 나중에 사용하기 쉽게 함수로 만들자.
(defn xors [max-x max-y] (for [x (range max-x) y (range max-y)] [x y (bit-xor x y)])) (xors 2 2) ;=> ([0 0 0] [0 1 1] [1 0 1] [1 1 0])
-
위의 함수를 Clojure 소스파일 확장자인 .clj로 저장해두면 좋을것 같다. 또는 ClojureScript 파일인 .cljs로 저장해두자.
-
Clojure REPL은 자바 라이브러리를 실험하기에 좋은 환경이다. java.awt의 Frame을 가지고 시작해보자.
(def frame (java.awt.Frame.)) ;=> #'user/frame
-
Frame이 생성되었는데 볼수가 없다. 왜 그런지 frame의 상태를 확인해보자.
frame ;=> #<Frame java.awt.Frame[frame0,0,22,0x0,invalid,hidden,...]>
-
뭔가 hidden이라는 것이 보이는 걸로 보아 이것을 바꿔줄 수 있는 메서드가 있을 것 같다. Frame의 모든 메서드 중에서 Vis어쩌고로 시작되는 메서드를 찾아보자.
(for [meth (.getMethods java.awt.Frame) :let [name (.getName meth)] :when (re-find #"Vis" name)] name) ;=> ("setVisible" "isVisible")
-
관련된 메서드가 두개 보인다. 두개다 REPL에서 확인해보자.
(.isVisible frame) ;=> false (.setVisible frame true) ;=> nil
-
setVisible을 했는데도 화면에 나타자지 않는다. 아까 frame의 속성을 봤을 때 크기로 보이는 값이 0,0 이였던것을 기억해보면 크기가 지정되지 않아 화면에 안보인것 같다.
(.setSize frame (java.awt.Dimension. 200 200)) ;=> nil
-
이제 화면에 나왔다. 팁으로
(javadoc frame)
을 하면 자바 문서가 브라우저 창으로 나온다. -
화면에 뭘 그리기 위해서 그래픽 컨택스트를 가져와 보자.
(def gfx (.getGraphics frame)) ;=> #'user/gfx
-
화면에 뭘 그려보자.
(.fillRect gfx 100 100 50 75)
-
화면에 검은 사각형이 나왔다. 재미있지 않는가? 이제 오랜지색 사각형을 그려보자.
(.setColor gfx (java.awt.Color. 255 128 0)) (.fillRect gfx 100 150 75 50)
-
다른 여러가지도 REPL에서 실험해볼 수 있다.