-
Notifications
You must be signed in to change notification settings - Fork 1
2. Drinking from the Clojure firehose
- evaluate : ํ๊ฐ ๋๋ ๊ณ์ฐ์ด๋ผ๊ณ ํ๋๋ฐ, ๋ญ๊ฐ ์์ด ์ด์์ผ๋ก ์๋ฟ์ง ์๋!
- literal syntax : ๋ฌธ๋ฒ ๊ตฌ๋ฌธ์ด๋ผ๊ณ ํ๋๋ฐ, ๋ญ๊ฐ ์ ๋งคํ ๋ง ์ค ํ๋์ธ๋ฏ
- store : ์ ์ฅ์ด๋ผ๊ณ ํ๋๋ฐ, ๊ทธ๋ฅ ๊ฐ์ง๋ค๋ผ๊ณ ํ๋๊ฒ ์ข์ ๊ฑฐ ๊ฐ๊ธฐ๋..
- arbitrarily precise
์ด ๊ณผ์์๋ ๋ค์ ๋ด์ฉ์ ๋ฐฐ์๋๋ค.
- Scalars: the base data types
- Putting things together: collections
- Making things happen: functions
- Vars are not variables
- Locals, loops, and blocks
- Preventing things from happening: quoting
- Using host libraries via interop
- Exceptional circumstances
- Modularizing code with namespaces
- ํ์์ ์ธ ๊ธฐ์ด๋ค
- ํํ ๋ฆฌ์ผ์ ๋ฐ๋ก ์ ๊ณตํ๋ ๊ฒ์ด ์ด์ํด ๋ณด์ด๊ฒ ์ง๋ง,์ธ์ด์ ์๊ฐ์ ์๊ฐํ๋๋ฐ ๊ฐ์ฅ ์ค์
- ํด๋ก์ ธ๋ก ํ๋ก๊ทธ๋๋ฐ ํด๋ดค๋ค๋ฉด ๋ฆฌ๋ทฐ๊ฐ ๋ ๊ฒ์ด๊ณ ์๋๋ผ๋ฉด
- ํด๋ก์ ์ฝ๋ ์ฐ๊ธฐ ์์ํ๋๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์๋ ค์ค๊ฒ์ด๋ค.
- ์ด ์ฑํฐ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ ๊ฐ ๋์ค๋๋ฐ ์ด๋ ์ฆ์ ๊ฐ์กฐ(์ดํด๋ฅผ์ํ)ํ๊ธฐ ์ํ ํ์์ ์ธ ๊ฒ์ด๋ค.
- ๋ชจ๋ ํผ์ณ(๊ธฐ๋ฅ)์ ๋งค๋ฌ๋ฆด ํ์๋ ์๋ค. ๋๋ ๊ฒฐ๊ตญ ์๊ฒ ๋ ๊ฒ!
- ํด๋ก์ ์คํ์ REPL(Read-Eval-Print Loop)๋ก ํ ๊ฒ์ด๋ค.
- REPL ์ธ์ ์ ์คํํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ํ๋กฌํํธ๊ฐ ๋์จ๋ค :
user =>- user ํ๋กฌํํธ๊ฐ REPL์ ๊ฐ์ฅ ์์ ๋ค์์คํ์ด๋ค.
- ์ด ์ํ์์ ํด๋ก์ ๋ ํํ์์ ๊ธฐ๋ค๋ฆฐ๋ค.
- ์ ํจํ ํด๋ก์ ํํ์์ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋๋ค. ( numbers, symbols, keywords, Booleans, characters, functions, function calls, macros, strings, literal maps, vectors, queues, records, sets)
-
numbers,strings,keywords๋ฅผ ํฌํจํ ๋ช๋ช ํํ์์enter๋ฅผ ํ ๋ ์ค์ค๋ก ๊ณ์ฐ์ด ๋๋ค. - ์ฃผ์์
;(์ธ๋ฏธ์ฝ๋ก ) ๋ค์ ์ด๋ค.
- ์ค์นผ๋ผ ๋ฐ์ดํฐ ํ์
- ํด๋ก์ ๋ ํ๋ถํ ๋ฐ์ดํฐ ํ์ set์ ๊ฐ์ง
- ๋ค๋ฅธ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ฐ๊ฐ ํ๋์ ๋ฐ์ดํฐ ๋ฐ์ดํฐ ๋จ์๋ฅผ ํํํ๋ integer,string,floating-point์ ๊ฐ์ ์ค์นผ๋ผํ์ ์ ์ ๊ณต.
- ์๋ก ๋ค๋ฅธ ์นดํ ๊ณ ๋ฆฌ์ ์ค์นผ๋ผ ํ์ ์ ์ ๊ณตํ๋ค. (integers/floats/rationals/symbols/keywords/strings/characters/Booleans/regex patterns)
- ์์ ์ ํจ๊ป ์ฐจ๋ก๋๋ก ๋ฐฐ์๋ด ์๋ค~
Number๋ ๋ค์์ผ๋ก ๊ตฌ์ฑ
-
0 - 9 ๊น์ง ์ซ์
-
์์์
-
+,-๊ธฐํธ -
e- ์ง์ํํ
-
์ด๋ฌํ ์์ ์ด์ธ์๋, ํด๋ก์ ์์ ๋ค๋ฃจ๋ ์ซ์๋ 8์ง์๋ 16์ง์๋ฅผ ์ทจํ ์ ์์ผ๋ฉฐ, ๋ํ ์์์ ์์์๋ฆฌ(M flag)๋ ์์์ ํฌ๊ธฐ์ ์ ์(N flag)๋ฅผ ๋ํ๋ด๋ ์ต์ ์ ํฌํจํ๋ค.
-
๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ซ์์ ์ ๋ฐ๋ (์์์ ์ดํ)๋ host platform, ํน์ ์๋ฐ์ C#์ ๊ฒฝ์ฐ์ฒ๋ผ ์ธ์ด ์ฌ์์ ์ํด ์ ํ๋๋ค. ํด๋ก์ ๋ ์์์ ์ ๋ฐ๋ ์ซ์๋ฅผ ์ ๊ณตํ์ง๋ง, default๋ก ํธ์คํธ ์ธ์ด (Java ํน์ Javascript)์ ๊ธฐ๋ณธํ์์ ๋ฐ๋ฅธ๋ค. JVM์ ๊ฒฝ์ฐ๋ ์์ ์ฑ์ ์ํด ์ค๋ฒํ๋ก์ฐ ๋ฐ์์ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
- ๋ชจ๋ ์ซ์ ์งํฉ, +,-
- ํด๋ก์ ์์, (์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ํน์ ํ ํ์ ์ผ๋ก๋ ์ง์ ํ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง) ์ผ๋จ ๋ถํธ๋ ์ซ์๋ก ์์๋์ด ์ซ์๋ก๋ง ์ด์ด์ง๊ณ ์๋ค๋ฉด ์์์ ์ ์ ํํ๋ก ์ ์ฅ๋๋ค.
- ํด๋ก์ ์์ integer๋ ์ด๋ก ์ ์ผ๋ก๋ ๋ฌดํ๋ ๊ฐ์ ๊ฐ์ง ์ ์์ง๋ง, ์ค์ ๋ก๋ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ๋ฅํ ํฌ๊ธฐ๋งํผ ๊ฐ์ง
- ๋ค์์ ์ซ์๋ค์ ํด๋ก์ ์์ integer๋ก ๋ฐ์๋ค์ฌ์ง
49
+9
-107
991778647261948849222819828311491035886734385827028118707676848307166514
- ๋ง์ง๋ง ์ซ์ ๋นผ๊ณ ๋ ๋ชจ๋ Java์ long์ฒ๋ผ ์ฝํ์ง๋ค.
- ๋ง์ง๋ง ์ซ์(๊ธธ๊ฒ ๋์ด๋ ์ซ์๋ค)๋ ๋๋ฌด ์ปค์ BigInt๋ก ์ฝํ์ง๋ค.
- ๋ค์์ ์ซ์๋ค์ ๊ฐ์ ์ซ์์ ๋ํด, ๊ฐ๊ฐ 10์ง๋ฒ, 16์ง๋ฒ, 8์ง๋ฒ radix-32, ์ด์งํ๊ธฐ๋ก ๋ํ๋ธ ๊ฒ์ด๋ค.
[127 0x7F 0177 32r3V 2r01111111]
;=> [127 127 127 127 127]
- base36
- (!todo)
- ์ต๋ ํํ๊ฐ๋ฅํ ์ง๋ฒ์ 36๊ฐ( 0~9๊น์ง + 26๊ฐ์ ASCII ๋ฌธ์์)
- ๋ถ๋์์ซ์ ์ซ์๋ ์ ๋ฆฌ์์ ์์์ ๊ฐ(!todo:decimal point)
- ํด๋ก์ ์ integer๊ตฌํ์ฒ๋ผ, ์์์ ์ซ์ (!todo: arbitrarily precise)
- ๋ถ๋์์ซ์ ์ซ์๋ ์ ํต์ ์ธ ํ์์ธ ๋ช๊ฐ์ ์ซ์์, ์์ซ์ , ๊ทธ๋ฆฌ๊ณ ๋ช๊ฐ์ ์ซ์๋ก ์ด๋ฃจ์ด์ง
- ํ์ง๋ง, ๋๋ฌธ์๋ ์๋ฌธ์ E๋ก ๊ตฌ๋ถ๋ ์ง์๋ถ๋ถ์ ๋ฐ๋ผ์ค๋ ์ ํจ๋ถ๋ถ์ด ์๋ ๊ณณ์ ์ง์ํ์(๊ณผํ์ ๊ธฐ์๋ฒ)๋ ์ทจํ ์ ์๋ค.
- ๋ถ๋ ์์ซ์ ์ซ์์ ์
1.17
+1.22
-2.
366e7
32e-14
10.7e-3
์ซ์๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํฌ๊ฒ ๋น์ทํ๋ค. ์ด์ ๋ ๋ฆฌ์ต๊ณผ ๋ฆฌ์ต์ ์ํฅ์ ๋ฐ์ ์ธ์ด๋ค์ ๋๋ ทํ ํน์ง์ ๊ฐ๋ ์ค์นผ๋ผํ์ ์ ์ดํผ์!
- ์ ๋ฆฌ์
- ํด๋ก์ ๋ ์ ์์ ๋ถ๋์์์ ๋ฟ๋ง ์๋๋ผ Rational ํ์ ์ ์ ๊ณตํ๋ค.
- Rationalํ์ ์ ๋ถ๋์์ซ์ ๋ณด๋ค ํํํ๊ธฐ์ ์ข ๋ ์ธ๋ฐํ๊ณ ์ ํํ๋ค.
- Rational์ ๊ณ ์ ์ ์ผ๋ก ์ ์์ ๋ถ์์ ๋ถ๋ชจ๋ก ํํ๋๊ณ , ๊ทธ๊ฒ ํด๋ก์ ์์ ์ ํํ๊ฒ ํํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- Raitional type ์
22/7
-7/22
1028798300297636767687409028872/88829897008789478784
-103/4
ํด๋ก์ ์์ rational ์ซ์๋ก ์์๋ ๊ฒ์ ๊ทธ๋ค์ ๊ฐ๋ฅํํ ๋จ์ํํ๋ค๋ ๊ฒ์ด๋ค. โ rational 100/4๋ integer 25๋ก ํด์ํ๋ค.
- ํด๋ก์ ์์ Symbol์ ์ค์ค๋ก ๊ทธ ์์ฒด์ธ ๊ฐ์ฒด์ด์ง๋ง, ๊ฐ๋์ ๋ค๋ฅธ ๊ฐ์ ํํํ๊ธฐ๋ ํจ
(def yucky-pi 22/7)
yucky-pi
;;=> 22/7
- ์ซ์๋ ๋ฌธ์์ด(string)์ด ๊ณ์ฐ๋ ๋์๋ ์ ํํ ๊ฐ์ object๋ฅผ ๋ฐํ๋ฐ๋๋ค. ๋ฐ๋ฉด symbol์ ๊ฒฝ์ฐ, ๊ทธ symbol์ด ํ์ฌ์ ๋ฌธ๋งฅ์์ ์ฐธ์กฐํ๋ ์ด๋ ํ ๊ฐ์ด๋ ๋ฐํ๋ฐ๋๋ค. ์ฆ, symbol์ ๋๊ฐ ํจ์ ์ธ์, ์ง์ญ๋ณ์, ์ ์ญ๋ณ์๋ ์๋ฐ ํด๋์ค๋ฅผ ์ฐธ์กฐํ๋ค.
- keywords๋ ํญ์ ๊ทธ๋ค ์ค์ค๋ก๋ก ํ๋จ(evaluate)์ ๋ด๋ฆฌ๋ ๊ฒ ์ธ์๋ ์ฌ๋ณผ๊ณผ ๋น์ทํ๋ค.
- ํด๋ก์ ์์๋ ์ฌ๋ณผ๋ณด๋ค ํค์๋์ ์ฌ์ฉ์ ํจ์ฌ ๋ ๋ง์ด ๋ณผ ๊ฒ์ด๋ค.
- keyword ๋ฌธ๋ฒ๊ตฌ๋ฌธ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค
:chumby
:2
:?
:ThisIsTheNameOfaKeyword
-
ํค์๋ ์์
:(์ฝ๋ก )์ด ๋ถ์ง๋ง, ์ด๊ฒ์ ๋ฌธ๋ฒ๊ตฌ๋ฌธ์ ์ผ๋ถ์ด์ง, ์ด๋ฆ ์์ฒด์ ์ผ๋ถ๋ ์๋๋ค. -
์์ธํ ๊ฒ์ 4.3์์ ์ดํ ๊ฒ
-
(!todo literal syntax)
- ํด๋ก์ ์ string์ ๋ค๋ฅธ ์ธ์ด์ string๊ณผ ๋น์ทํ๊ฒ ํํ๋๋ค.
- string์ ์๋ฐ์ดํ๋ก ๋๋ฌ์ธ์ธ ์ฐ์๋ ๋ฌธ์๋ค์ด๊ณ , ๊ฐํ ํฌํจ์ด ๊ฐ๋ฅํ๋ค.
"This is a string"
"This is also a
String"
- ๋์ ์จ์ง๋ฐ๋ก ์ ์ฅ๋๋ค. ํ์ง๋ง REPL์์ ์ถ๋ ฅํ ๋๋, ๋ณต์ ํ์ ์คํธ๋ง์ escape๋ฌธ์๋ฅผ ํฌํจํ๋ค.
"This is also a\n String"
- ํด๋ก์ Character๋
\(๋ฐฑ ์ฌ๋์)๊ฐ ์์ ์ ํ ๋ฌธ๋ฒ๊ตฌ๋ฌธ์ผ๋ก ์ฐ์ฌ์ง๊ณ , ์ ์ฅ์ ์๋ฐ์ Character ๊ฐ์ฒด๋ก ์ ์ฅ๋๋ค.
\a ; The character lowercase a
\A ; The character uppercase A
\u0042 ; The Unicode character uppercase B
\\ ; The back-slash character \
\u30DE ; The Unicode katakana character ?
์ฌ๊ธฐ๊น์ง๊ฐ ํด๋ก์ ์ ์ค์นผ๋ผ ๋ฐ์ดํฐ ํ์ ์๋ ๋ค์ ์น์ ์์๋ ํด๋ก์ ์ ์ ๋ง ์ฌ๋ฐ๋ ์ฝ๋ ์ ๋ฐ์ดํฐ ํ์ ์ ๋ํด ๋ ผ์ํด๋ด ์๋ค.
collection์ ๋ํด์ chap5์์ ๋์ฑ ์์ธํ๊ฒ ๋ค๋ฃฐ ๊ฒ์ด๋ค. ํ์ง๋ง ํด๋ก์ ํ๋ก๊ทธ๋จ์ ๋ค์ํ ์ข ๋ฅ์ ๋ฌธ์(literal) ์ฝ๋ ์ ๋ค๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์, list,vectors,maps,sets์ ๋ํด์ ์ต์ํ์ด๋ผ๋ ์์๋๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ด๋ค.
- List๋ Lisp(๋ฆฌ์ต์ ์ด๋ฆ์ ๊ฒฐ๊ตญ _list processing_์ผ๋ก ๋ถํฐ ์๋ค.)์์ ๊ณ ์ ์ ์ธ ์ฝ๋ ์ ํ์ ์ด๊ณ , ํด๋ก์ ๋ ์์ธ๋ ์๋๋ค.
- ๋ฌธ์(literal) ๋ฆฌ์คํธ๋ ๊ดํธ์ ์ฐ์ธ๋ค.
(yankee hotel foxtrot)
- list๊ฐ evaluate(ํ๊ฐ)๋ ๋, ์ฒซ๋ฒ์งธ ์์(์ฌ๊ธฐ์ yankee)๋ ํจ์, ๋งคํฌ๋ก ๋๋ ํน๋ณํ ์ฐ์ฐ์๋ก ๊ฒฐ์ ๋๋ค.
-
yankee๊ฐ ํจ์๋ผ๋ฉด,๋ฆฌ์คํธ์ ๋จ์ ๋ค๋ฅธ ์์๋ค์ ์์๋๋ก ๊ณ์ฐ(evaluate)๋๊ณ , ๊ฒฐ๊ณผ๋ ๊ทธ๊ฒ์ ์ธ์๋ก yankee์ ์ ๋ฌ๋๋ค.
** NOTE **
ํ์(form)์ด๋ผ๋ ๊ฒ์ ๋ฆฌ์คํธ, ๋ฒกํฐ, ๋งต, ์ซ์, ํค์๋ ํน์ ์ฌ๋ณผ๊ฐ์ ๊ฒ๋ค์ฒ๋ผ
ํ๊ฐ๋์ด์ผ ํ๋์ด๋ ํ ํํ์ ํด๋ก์ ๊ฐ์ฒด๋ก ๊ฐ์ฃผ๋๋ค๋ ๊ฒ์ ์ฃผ์ํด์ผ ํ๋ค.
ํน๋ณํ ํ์(special form)์ ํน์ ๊ตฌ๋ฌธ์ด๋ ๊ธฐ๋ณธ ํด๋ก์ ์์์ ํตํด ๊ตฌํ๋์ด
์์ง ์๋ ํน์ํ ํ๊ฐ ๊ท์น์ด ์๋ฐ๋๋ ํ์์ด๋ค.
์ด special form์ ํ ์๋ก ์๋ฐ์์์
์ํธ์ฐ์ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ .(dot) ์ฐ์ฐ์๋ฅผ ๋ค ์ ์๋ค.
-
yankee๊ฐ ๋งคํฌ๋ก๋ ํน๋ณํ ์ฐ์ฐ์๋ผ๋ฉด, ๋ฆฌ์คํธ์ ๋จ์ ๋ค๋ฅธ ์์๋ค์ ๋ฐ๋์ ๊ณ์ฐ(evaluate)๋์ง๋ ์์ง๋ง, ๋งคํฌ๋ก๋ ์ฐ์ฐ์์ ์ ์์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋๋ค. - List๋ ๋ค๋ฅธ ์ฝ๋ ์ ์ ๋ฌผ๋ก ์ด๊ณ ์ด๋ค ํ์ ๋ ์์๋ก ๊ฐ์ง ์ ์๋ค.
- ๋ค์ ์๋ค์ ๋ณด์
(1 2 3 4)
()
(:fred ethel)
(1 2 (a b c) 4 5)
- ์ฐธ๊ณ ๋ก ์ผ๋ถ lisp๊ณผ ๋ฌ๋ฆฌ,
()๋ก ์ฐ์ธ,ํด๋ก์ ์์ ๋น์ด์๋ list๋ nil์ด ์๋๋ค.
- list์ ๊ฐ์ด vector๋ ๋์ด๋ ๊ฐ(value)๋ค์ ์ ์ฅํ๋ค.
- ์ฌ๋ฌ ์ฐจ์ด์ ์ 5.4์์ ์ค๋ช ํ ์์ ์ด์ง๋ง, ์ค์ํ๊ฒ ๋ค๋ฅธ ๋๊ฐ์ง๋ ์ดํด๋ณด์.
- ์ฒซ์งธ, vector๋ ๊ฐ์ง ๊ดํธ๋ฅผ ์ฐ๋ ๋ฌธ๋ฒ๊ตฌ๋ฌธ ๊ฐ๋๋ค.
[1 2 :a :b :c]
- ๋ค๋ฅธ ์ค์ํ ์ฐจ์ด์ ์ vector๋ ๊ฐ ์์๋ฅผ ์์๋๋ก ๊ณ์ฐ(evaluate)ํ๋ ๊ฒ์ด๋ค.
- ์ด๋ค ํจ์๋ ๋งคํฌ๋ก ํธ์ถ๋ ๋ฒกํฐ ์์ฒด์์ ์ํ๋์ง ์๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ฝ ํน์ ๋ฆฌ์คํธ๊ฐ ๋ฒกํฐ ๋ด๋ถ์ ์์ ๋, ๊ทธ ๋ฆฌ์คํธ๋ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ๊ท์น์ ๋ฐ๋ฅธ๋ค. ๋ฆฌ์คํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฒกํฐ๋ heterogeneousํ ํ์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋น์ด ์๋ ๋ฒกํฐ []๋ nil์ฒ๋ผ ์ฌ์ฉ๋์ง ์๋๋ค.
- Map์ ์ ์ผํ key๋ค๊ณผ key๋ง๋ค ํ๋์ฉ ์๋ value์ ๊ฐ์ง๋ค.
- ๋ช๋ช ์ธ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ dictioanaries ๋ hash ์ ๋น์ทํ๋ค
- ํด๋ก์ ๋ ์๋ก ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ง Map์ ์ฌ๋ฌ ํ์
์ ๊ฐ๋๋ค.
- ์ง๊ธ ๋ชจ๋ฅธ๋ค๊ณ ๊ฑฑ์ ํ ํ์๋ ์๋ค.
- Map์ ์ค๊ดํธ
{}์ฌ์ด์ key์ value๊ฐ ๋ฐ๋ณต๋๋ ๊ตฌ๋ฌธ๋ฌธ๋ฒ์ผ๋ก ์ฐ์ฌ์ง๋ค. - ์ฝค๋ง (,)๋ ์์ฃผ ์(key-value) ์ฌ์ด์ ์ฐ์ด์ง๋ง, ํด๋ก์ ์ ๋ชจ๋ ๋ฌธ๋งฅ์์์๊ฐ์ด ๊ณต๋ฐฑ์ฒ๋ผ ๊ฐ์ฃผ๋๋ค. (๊ณต๋ฐฑ์ผ๋ก ํด๋ ๋ฌด)
{1 "one", 2 "two", 3 "three"}
- vector์ ๋ง์ฐฌ๊ฐ์ง๋ก map ๊ตฌ๋ฌธ์ ๋ชจ๋ ์์(๊ฐ key์ ๊ฐ value)๋ ๊ฒฐ๊ณผ๊ฐ map์์์ ์ ์ฅ๋๊ธฐ ์ด์ ์ ํ๊ฐ(evaluate) ๋๋ค.
- vector์ ๋ค๋ฅด๊ฒ, ๊ณ์ฐ(evaluate)์์๋ ๋ณด์ฅ๋์ง ์๋๋ค.
- Map์ key๋ value์ ๋ํด ์ด๋ค ํ์
์ด๋ ์์๋ก ๊ฐ์ง ์ ์๊ณ ,
๋น์ด์๋ map
{}์ nil์ด ์๋๋ค.
- Sets์ 0๊ฐ๋๋ ๊ทธ ์ด์์ ์ ์ผํ ์์๋ฅผ ๊ฐ๋๋ค.
- ํด์(
#)๋ก ์์ํ๋ ์ค๊ดํธ์ ์ฐ์ธ๋ค.
#{1 2 "three" :four 0x5}
- ๋น์ด์๋ Set
#{}๋ nil์ด ์๋๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ ๊ธฐ๋ณธ์ ์ธ collectionํ์ ์ ์ ๋ถ๋ค. Chap4์์ ๊ฐ ํ์ ์ ์ฅ๋จ์ ๊ณผ queue๋ฅผ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
- ํด๋ก์ ์์ ํจ์๋ first-class ํ์ ์ด๋ค. ๋ญ๋ง์ด๋๋ฉด ์์์ ๊ฐ(value)๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค.
- ํจ์๋ list๋ ๋ค๋ฅธ collection๋ก ๊ฐ์ฃผ๋ vars๋ก ์ ์ฅ๋ ์ ์๊ณ , ์ธ์๋ก ์ ๋ฌ๋ ์๋ ์์ผ๋ฉฐ, ๋ค๋ฅธ ํจ์์ ๋ฆฌํด ๊ฒฐ๊ณผ๋ ๋ ์๋ ์๋ค.
(vector 1 2 3) ;;1,2,3์ vector๋ผ๋ ํจ์์ ์ ๋ฌ
;;=> [1 2 3] ;;vertor๋ฅผ ๋ฐํ
-
C-style์์ ์ฌ์ฉ๋๋ prefix notation ์ด infix notation์ ๋นํด ๊ฐ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ prefix notation์ ์ฐ์ฐ์๋น ํผ์ฐ์ฐ์์ ๊ฐ์๋ฅผ ์์๋ก ์ทจํ ์ ์์ผ๋, infix notation์ ๋ ๊ฐ๋ก ์ ํ๋๋ค๋ ๊ฒ์ ์๋ค. ๋ ๋ค๋ฅธ ์ด์ ์ผ๋ก๋ prefix notataion์ ์ฐ์ฐ์์ ์ฐ์ ์์ ๋ฌธ์ ๋ฅผ ์์ ์ค๋ค๋ ์ ์ธ๋ฐ, ์ด๊ฒ structuring code์ ๋นํด ํฌ๊ฒ ์ข๋ค๊ณ ํ๊ธฐ๋ ์ ๋งคํ๋ค. ํด๋ก์ ๋ ์ฐ์ฐ์ ํ๊ธฐ๋ฒ๊ณผ ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ ๊ตฌ๋ถํ์ง ๋ชปํ๋ค. ์ฆ, ๋ชจ๋ ํด๋ก์ ์์ฑ์, ํจ์, ๋งคํฌ๋ก, ์ฐ์ฐ์๋ prefix์ ์ํด ํ์ฑ๋๊ฑฐ๋ ์์ ํ ๊ดํธ์ฒ๋ฆฌ๋ ํํ๋ก ํ๊ธฐ๋๋ค. ์ด๋ฌํ ํต์ผ๋ ๊ตฌ์กฐ๋ Lisp์ ๊ฐ์ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ๋๋ผ์ด ์ ์ฐ์ฑ์ ์ํ ๊ธฐ์ด๋ฅผ ํ์ฑํ๋ค
-
infix notation์ ๋นํด prefix notation์ ์ง์ ์ ์ธ ๋ช ๋ฐฑํ ์ด์ ์ C์คํ์ผ์ ์ธ์ด๋ former๊ฐ ํ๋ฝํ๋ค ์ฐ์ฐ์๋ง๋ค ํผ์ฐ์ฐ์ ์ซ์๊ฐ infix๋ ๋๊ฐ์ ํผ์ฐ์ฐ์๋ง ํ๋ฝํ๋๋ฐ ๋นํด
-
Prefix notation์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ์์ ์ฅ์ ์ ์ฐ์ฐ์๊ฐ ์์๋ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๋ค๋ ๊ฒ
-
ํด๋ก์ ๋ ์ฐ์ฐ์ notation๊ณผ ํจ์ ํธ์ถ์ ๊ตฌ๋ถ์ ๋ชปํ๋ค.
- ๋ชจ๋ ํด๋ก์ ์์ฑ์, ํจ์, ๋งคํฌ๋ก, ์ฐ์ฐ์๋ prefix ๋๋ ์์ ํ ๊ดํธ๋ก ์ธ์ฌ์ง ํ๊ธฐ๋ฅผ ์ด๋ค.
- ์ด ๊ท ์ผํ ๊ตฌ์กฐ๋ ๋ฆฌ์ต๊ฐ์ ์ธ์ด๊ฐ ์ ๊ณตํ๋ ๋๋ผ์ด ์ ์ฐํจ์ ๊ธฐ์ดํ๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ค์ ๋๋ถ๋ถ ๋ณ์(variables)์ ๋ณํ(mutable)์ ์ต์ํ๋ค.
- ํด๋ก์ ์์ variable๊ณผ ๊ฐ์ฅ ์ ์ฌํ ๊ฒ์
var๋ค. - var๋ symbol์ ์ํด ๋ช
๋ช
๋์๊ณ ๋จ์ผ ๊ฐ(value)๋ฅผ ๊ฐ๋๋ค.
- ์ด ๊ฐ์ ํ๋ก๊ทธ๋จ ์คํ์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
- but this is best reserved for the programmer making manual changes
- ๋ํ var์ ๊ฐ์ ํจ์์ธ์์ ์ง์ญ๋ณ์์ ์ํด shadowed(์ง์ญ๋ณ์๋ก ๋ฐฐ์ )๋ ์ ์๋ค. (๋น๋ก shadowing์ด ์๋์ ๊ฐ์ ๋ฐ๊พธ์ง ์๋๋ค)
- ํด๋ก์ ์์ var๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ๋ณดํต์ ๋ฐฉ๋ฒ์
def๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
(def x 42)
- def๋ฅผ ์ด์ฉํด 42๋ผ๋ ๊ฐ์ ์ฌ๋ณผ x์ ์ง์ ํ๋ฉด, ์ด ๋ root binding์ด๋ผ๊ณ ์๋ ค์ง ๊ธฐ๋ฅ์ ์์ฑํ๋ค.
- ํํ ์ผ์ด์ค๋ symbol x๊ฐ 42์ ๋ฌถ์ด๋ ๊ฒ์ด์ง๋ง var๋ value๋ฅผ ์๊ตฌํ์ง ์๋๋ค.
(def y)
y
;=> java.lang.IllegalStateException: Var user/y is unbound.
Clojure๋ ์๋ฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์๋ฐ์ ํด๋์ค๋ค์ ์ฌ์ฉํ ์ ์๋ค.
java.util.Locale/JAPAN
;=> #<Locale ja_JP>
(Math/sqrt 9)
;=> 3.0
- java.lang์ ์๋ ํด๋์ค๋ค์ ๋ฐ๋ก ์ธ ์ ์๋ค.
- ClojureScript static ๋งด๋ฒ์ ์ ๊ทผํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค. (์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์)
- new๋ผ๋ ์ฐ์ฐ์๋ก ์๋ฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
(new java.awt.Point 0 1)
;=> #<Point java.awt.Point[x=0,y=1]>)
- ์๋ java.awt.Point ์์ฑ์์ 0, 1์ ํ๋ผ๋ฏธํฐ๋ก ํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์์ด๋ค.
(new java.util.HashMap {"foo" 42 "bar" 9 "baz" "quux"})
;=> {"baz" "quux", "foo" 42, "bar" 9}
- Collection์ ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Clojure์ Collection๊ณผ ํธํ์ด ๊ฐ๋ฅํ๋ค.
(java.util.HashMap. {"foo" 42 "bar" 9 "baz" "quux"})
;=> {"baz" "quux", "foo" 42, "bar" 9}
-
์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก new ๋์ ํด๋์ค์ด๋ฆ ๋ค์ .์ ๋ถ์ฌ ์์ฑํ ์ ์๋ค.
-
ํด๋ก์ ์คํฌ๋ฆฝํธ์์๋ ์ด์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
(js/Date.)
;=> #inst "2013-02-01T15:10:44.727-00:00"
- .๊ณผ -๋ฅผ ๊ฐ์ง๊ณ ์ธ์คํด์ค ํ๋์ ์ ๊ทผํ ์ ์๋ค.
(.-x (java.awt.Point. 10 20))
;=> 10
- .๊ณผ ๋ฉ์๋๋ช ์ ๊ฐ์ง๊ณ ๋งค์๋๋ฅผ ํธ์ถ ํ ์ ์๋ค.
(.divide (java.math.BigDecimal. "42") 2M)
;=> 21M
- set! ํจ์๋ก ํ๋์ ๊ฐ์ ์ธํ ํ ์ ์๋ค.
(let [origin (java.awt.Point. 0 0)]
(set! (.-x origin) 15)
(str origin))
;=> "java.awt.Point[x=15,y=0]"
- ๋ฉ์๋์ ํธ์ถ์ด ์ฐ์๋๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
new java.util.Date().toString().endsWith("2014") /* Java code */
(.endsWith (.toString (java.util.Date.)) "2014") ; Clojure code
;=> true
- ๊ฐ๋ ์ฑ์ ์ํด .. ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ๋ค.
(.. (java.util.Date.) toString (endsWith "2014"))
;=> true
- ->, ->> ๋งคํฌ๋ก๋ ..๊ณผ ์ ์ฌํ์ง๋ง ์ผ๋ฐ์ ์ธ ํด๋ก์ ํจ์์ ์ฐ์๋ ํธ์ถ์ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ํด์ค๋ค. (8์ฅ์์ ๋ค๋ฃฌ๋ค.)
- doto ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋์ ์ธ์คํด์ค์ ์ฐ์๋ ๋ฉ์๋ ํธ์ถ์ ๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
// This is Java, not Clojure
java.util.HashMap props = new java.util.HashMap();
props.put("HOME", "/home/me"); /* More java code. Sorry. */
props.put("SRC", "src");
props.put("BIN", "classes");
- ์๋์ ๊ฐ์ด doto๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
(doto (java.util.HashMap.)
(.put "HOME" "/home/me")
(.put "SRC" "src")
(.put "BIN" "classes"))
;=> {"HOME" "/home/me", "BIN" "classes", "SRC" "src"}
- ํด๋ก์ ์์๋ reify, deftype๋ก ์๋ฐ ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. (9์ฅ์์ ๋ค๋ฃธ)
- proxy๋ผ๋ ๋งคํฌ๋ก๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ด๋ ์์์ ๋ฐ์ ์ ์๊ฒ ํด์ค๋ค. (12์ฅ์์ ๋ค๋ฃธ)
- gen-class ๋งคํฌ๋ก๋ ์ ์ ์ผ๋ก ์ด๋ฆ์ ๊ฐ์ง ํด๋์ค๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค. (12์ฅ์์ ๋ค๋ฃธ)
์์ธ ์ฒ๋ฆฌ์๋ throw, try, catch์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ค.
- ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์์
(throw (Exception. "I done throwed"))
;=> java.lang.Exception: I done throwed ...
- ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์์
(defn throw-catch [f]
[(try
(f)
(catch ArithmeticException e "No dividing by zero!")
(catch Exception e (str "You are so bad " (.getMessage e)))
(finally (println "returning... ")))])
(throw-catch #(/ 10 5))
; returning...
;=> [2]
(throw-catch #(/ 10 0))
; returning...
;=> ["No dividing by zero!"]
(throw-catch #(throw (Exception. "Crybaby")))
; returning...
;=> ["You are so bad Crybaby"]
- ClojureScript์์๋ ์์ธ๋ฅผ ์ก์ ๋ js๋ฅผ ์จ์ค์ผ ํ๋ค.
(try
(throw (Error. "I done throwed in CLJS"))
(catch js/Error err "I done catched in CLJS"))
;=> "I done catched in CLJS"
Clojure์ ๋ค์์คํ์ด์ค๋ ํจ์, ๋งคํฌ๋ก, ๊ฐ๋ค์ ๋ฌถ์ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์๋ก์ด ๋ค์์คํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ns ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ค.
(ns joy.ch2)
- REPL ํ๋กฌํํธ๋ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ํ์ฌ ๋ค์์คํ์ด์ค๋ก ์ค์ ๋๋ค.
joy.ch2=>
- ๋ค์์คํ์ด์ค์์ ์์ฑํ ๊ฒ๋ค์ ๊ทธ ๋ค์์คํ์ด์ค์ ์ํ๊ฒ ๋๋ค.
- ns๋ก ํ์ ๋ค์์คํ์ด์ค๋ฅผ ํ์ธ ํ ์ ์๋ค.
joy.ch2=> (defn hello []
(println "Hello Cleveland!"))
joy.ch2=> (defn report-ns []
(str "The current namespace is " *ns*))
joy.ch2=> (report-ns)
;=> "The current namespace is joy.ch2"
joy.ch2=> hello
;=> #<ch2$hello joy.ch2$hello@2af8f5>
- ๋ค์์คํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ ๊ฒ๋ค์ ๋ฐ๋ก ์ฌ์ฉํ์ง ๋ชปํ๊ณ ์์ ๋ค์์คํ์ด์ค๋ฅผ ๋ช ์ํด์ค์ผํ๋ค.
(ns joy.another)
joy.another=>
joy.another=> (report-ns)
; java.lang.
; Unable to resolve symbol: report-ns in this context
joy.another=> (joy.ch2/report-ns)
;=> "The current namespace is joy.another"
- ๋ค์์คํ์ด์ค์์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค ์ฌ์ฉํ๊ธฐ์ํด require๋ฅผ ํตํด ๋ก๋ ํ ์ ์๋ค.
(ns joy.req
(:require clojure.set))
(clojure.set/intersection #{1 2 3} #{3 4 5})
;;=> #{3}
- :as๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์์คํ์ด์ค๋ฅผ ์ํ๋ ๊ฒ์ผ๋ก ๋ฐ๊ฟ ์ฌ์ฉํ ์ ์๋ค.
(ns joy.req-alias
(:require [clojure.set :as s]))
(s/intersection #{1 2 3} #{3 4 5})
;=> #{3}
- ๋ค์์คํ์ด์ค๋ static ๋ฉ์๋ ํธ์ถ๊ณผ ๋น์ทํด ๋ณด์ด๋๋ฐ ๋ค์์คํ์ด์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๊ณ static ๋ฉ์๋ ํธ์ถ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
clojure.set
; java.lang.ClassNotFoundException: clojure.set
java.lang.Object
;=> java.lang.Object
- ํผ๋์ค๋ฝ์ง ์๊ฒ ์์์ ์ ์ฐ์
- ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ํ์ฌ์ ๋ค์์คํ์ด์ค์ ์๋ ํจ์์ฒ๋ผ ๋งคํํด์ ์ฐ๋ฉด ํธ๋ฆฌํ๋ฐ ์ด๋ฅผ ์ํด :require์ :refer ์ต์ ์ ์ ๊ณตํ๋ค.
(ns joy.use-ex
(:require [clojure.string :refer (capitalize)]))
(map capitalize ["kilgore" "trout"])
;=> ("Kilgore" "Trout")
- :refer๋ฅผ ํ ๋ ์ถ์ฒํ์ง ์์ง๋ง :all ๊ฐ์ผ๋ก ๋ชจ๋ ํจ์๋ฅผ ํ์ฌ ๋ค์์คํ์ด์ค ์ฒ๋ผ ์ฌ์ฉํ๊ฒ ํ ์ ์๋ค. (์์ ์๋ :use๋ฅผ ์ฌ์ฉํ๋ค.)
- :require์ ์ต์ ์ด ์๋ ๋ ๋ฆฝ์ ์ผ๋ก :refer๋ฅผ ์ฌ์ฉํด์ ๋ก๋ฉํ ์ ์๋๋ฐ ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ํจ์๊ฐ ํ์ฌ ๋ค์์คํ์ด์ค๋ก ๋งคํ์ด๋๋ค.
(ns joy.yet-another
(:refer joy.ch2))
(report-ns)
;=> "The current namespace is joy.yet-another"
- :rename ์ต์ ์ผ๋ก ์๋ ํจ์๋ช ์ ๋ณ๊ฒฝํด์ ๋ก๋ฉํ ์๋ ์๋ค. (:require์์๋ ์ฌ์ฉ๊ฐ๋ฅ)
(ns joy.yet-another
(:refer clojure.set :rename {union onion}))
(onion #{1 2} #{4 5})
;=> #{1 2 4 5}
- :import๋ฅผ ์ฌ์ฉํ๋ฉด ํจํค์ง๋ช ์ ๋ค ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ก ์๋ฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
(ns joy.java
(:import [java.util HashMap]
[java.util.concurrent.atomic AtomicLong]))
(HashMap. {"happy?" true})
;=> {"happy?" true}
(AtomicLong. 42)
;=> 42
- java.lang์ ๊ทธ๋ฅ ์ฌ์ฉํ ์ ์๋ค.