Skip to content

3. Dipping Your toes in the pool

Eunmin Kim edited this page Oct 12, 2014 · 8 revisions

Truthiness

What's truth?

Don't create Boolean objects

nil vs false

Nil pun with care

Destructuring

Your assignment, should you choose to accept it

Destructuring with a vector

Destructuring with a map

Destructuring in function parameters

Destructuring vs. accessor methods

실험을 위해 REPL 사용하기

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에서 실험해볼 수 있다.

함께쓰기

뭔가 잘못되었을 때

재미로