-
Notifications
You must be signed in to change notification settings - Fork 1
3. Dipping Your toes in the pool
- ์ฌ์ ์ ์๋ฏธ: ์ง์ค์ฑ ๋ถ์ฌ(์ฌ์ค๊ณผ๋ ์๊ด์์ด ์ฌ๋๋ค์ด ์ง์ค์ด๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋ง์์์ ๋ถ์ฌํ๋ ์ง์ค์ฑ)
-
Every object is โtrueโ all the time, unless itโs nil or false.
(if true :truthy :falsey) ;=> :truthy (if [] :truthy :falsey) ;=> :truthy (if nil :truthy :falsey) ;=> :falsey (if false :truthy :falsey) ;=> :falsey
-
NEVER do this
(def evil-false (Boolean. "false")) evil-false ;=> false (= false evil-false) ;=> true (if evil-false :truthy :falsey) ;=> :truthy
-
right way
(if (Boolean/valueOf "false") :truthy :falsey) ;=> :falsey
-
Rarely do you need to differentiate between the two non-truthy values, but if you do, you can use nil? and false?
(when (nil? nil) "Actually nil, not false") ;=> "Actually nil, not false"
-
Keeping in mind the basic rule that everything in Clojure is truthy unless itโs false or nil is an astonishingly powerful concept, allowing for elegant solutions.
-
The seq function returns a sequence view of a collection, or nil if the collection is empty.
(seq [1 2 3]) ;=> (1 2 3) (seq []) ;=> nil
-
print-seq function
(defn print-seq [s] (when (seq s) B Check for empty (prn (first s)) (recur (rest s)))) (print-seq []) ;=> nil (print-seq [1 2]) ;1 ;2 ;=> nil
(assignment ํ ๋ ๋ฐ์๋ค์ผ ๊ฒ๋ง ์ ํํ๋ผ.)Your assignment, should you choose to accept it
๋ง์ ๊ฐ์ฒด ์งํฅ ์ธ์ด์์, ๋๋ ์๋ง ๋์ ์ฑ ๋ฐ์ดํ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด,๊ฐ๊ฐ์ ๊ฒํฐ์ธํฐ ๋ฉ์๋์ ์งํฉ๊ณผ ํจ๊ป ์ ํด๋์ค๋ฅผ ๋ง๋ค์์ ๊ฒ์ด๋ค. ํด๋ก์ ๋ ๋์ ์ ์ง์ด๋จ๋ค ํธ๋ฆฌํ๊ฒ ๋งต๊ณผ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ถ์ํ๋ฅผ ํ๋๋ฐ์. ์ด๊ฑฐ๋ ๋์คํธ๋ญ์ฒ๋ง์ ์์ฐ์ค๋ฝ๊ณ ์ง๊ด์ ์ด๊ฒ ํ๋ค. ๋๊ฐ
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์์ ์คํํด๋ณผ ์ ์๋ค.
-
์์์ ๋ง๋ค์ด๋ ํจ์๋ฅผ ์จ์ ์ฌ๋ฏธ๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋ณด์.
(doseq [[x y xor] (xors 200 200)] (.setColor gfx (java.awt.Color. xor xor xor)) (.fillRect gfx x y 1 1))
-
xors ํจ์์์ ๋์ค๋ ์ํ์ค์ ๋ฐฑํฐ ํญ๋ชฉ์ x, y, xor ๊ฐ์ ๋์คํธ๋ญ์ฒ๋งํด์ ์์์ผ๋ก ์ง์ ํ๊ณ ์ ์ฒด ํฝ์ ์ ๊ทธ๋ ค์ฃผ๋ ์์ ์ด๋ค.
-
ํจํด์ด ์ค๊ฐ์ ์งค๋ฆฌ๋ ๊ฒ์ ๋ง๊ธฐ์ํด์ ์ด๋ฏธ์ง ๋ฒ์๋ฅผ ๋ ํฌ๊ฒ ์ค์ ํด๋ณด์.
(doseq [[x y xor] (xors 500 500)] (.setColor gfx (java.awt.Color. xor xor xor)) (.fillRect gfx x y 1 1)) ; java.lang.IllegalArgumentException: ; Color parameter outside of expected range: Red Green Blue
-
๋ญ๊ฐ ์ ๋ชป๋์๋ค. REPL์์๋ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ํน๋ณํ var์ธ *e์ ์์ธ๊ฐ ์ ์ฅ๋๋ค. ์์ธ ์์ธ ๋ด์ฉ์ ๋ณด๊ธฐ ์ํด ์๋์ ๊ฐ์ด ํด๋ณด์.
(.printStackTrace *e) ; java.lang.IllegalArgumentException: Color parameter outside of ; expected range: Red Green Blue ; at clojure.lang.Compiler.eval(Compiler.java:4639) ; at clojure.core$eval__5182.invoke(core.clj:1966) ; at clojure.main$repl__7283$read_eval_print__7295.invoke(main.clj:180) ; ...skipping a bit here... ; Caused by: java.lang.IllegalArgumentException: Color parameter ; outside of expected range: Red Green Blue ; at java.awt.Color.testColorValueRange(Color.java:298) ; at java.awt.Color.<init>(Color.java:382) ; ...skipping a bit more... ; ... 11 more ;=> nil
-
๋ญ๊ฐ ๊ธด๊ธ์ด ๋์๋ค๊ณ ๋นํฉํ์ง ๋ง๊ณ ์ฒ์ฒํ ์ดํด๋ณด์. ๋ญ์ caused๋ฅผ ๊ธฐ์ค์ผ๋ก ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋ณผ ์ ์๊ณ ๋๋ฒ์งธ ๋ถ๋ถ์ธ Caused ๋ค์์ ๋์ค๋ ๋ฌธ์ฅ ๋ถํฐ ๋ณด์.
at java.awt.Color.testColorValueRange(Color.java:298)
-
java์ stack trace๋ ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋๋ค.
at <class>.<method or constructor>(<filename>:<line>)
-
์ด ๊ฒฝ์ฐ์๋
testColorValueRange
ํจ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ๋ค์ ๋ผ์ธ์ ๋ณด๋ฉดColor
์ ์์ฑ์์์ ์๋ฌ๊ฐ ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค. ๋ญ๊ฐ ๊ฐ์ ์ด๊ธฐํํ ๋ ์ ๋ชป๋๊ฒ ๊ฐ๋ค. ์ด๊ฒ์ ๊ณ ์ณ๋ณด์.(defn xors [xs ys] (for [x (range xs) y (range ys)] [x y (rem (bit-xor x y) 256)]))
-
bit-xor
์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ 256์ ๋๋จธ์ง ๊ฐ์ผ๋ก ๋ฐ๊ฟง๋ค. -
๋ค์ ํ์ธํด๋ณด๊ธฐ ์ํด์ ๊ธฐ์กด์ ์ด๋ฏธ์ง๋ฅผ ์ง์ฐ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค์.
(defn clear [g] (.clearRect g 0 0 200 200))
-
bit-xor
ํจ์๋ฅผ ์ฌ์ฉํด์ ์ฌ๋ฏธ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด๋ดค๋๋ฐ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด ๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ป์ ์ ์๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ์ฐ์ฐ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ์๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด์.(defn f-values [f xs ys] (for [x (range xs) y (range ys)] [x y (rem (f x y) 256)])) (defn draw-values [f xs ys] (clear gfx) (.setSize frame (java.awt.Dimension. xs ys)) (doseq [[x y v] (f-values f xs ys)] (.setColor gfx (java.awt.Color. v v v)) (.fillRect gfx x y 1 1))) (draw-values bit-and 256 256) (draw-values + 256 256) (draw-values * 256 256) ``
-
REPL์ ๊ฐ์ง๊ณ Clojure๋ฅผ ๊ฐ๋ฐํ๋ฉด ์ฌ์ฉํ๋ ค๋ ํจ์๋ฅผ ๋ฏธ๋ฆฌ ์คํํด๋ด์ผ๋ก ๊ฐ๋ฐ ์๊ฐ์ ๋ ์ค ์ผ ์ ์๋ค.