Skip to content

2. Drinking from the Clojure firehose

Minsun Lee edited this page Jul 28, 2014 · 30 revisions

ํ•ด์„ํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒƒ๋“ค

  • 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๋ฅผ ํ•  ๋•Œ ์Šค์Šค๋กœ ๊ณ„์‚ฐ์ด ๋œ๋‹ค.
  • ์ฃผ์„์€ ;(์„ธ๋ฏธ์ฝœ๋ก ) ๋’ค์— ์“ด๋‹ค.

Scalars: the base data types

  • ์Šค์นผ๋ผ ๋ฐ์ดํ„ฐ ํƒ€์ž…
  • ํด๋กœ์ €๋Š” ํ’๋ถ€ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… set์„ ๊ฐ€์ง
  • ๋‹ค๋ฅธ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋ฐ์ดํ„ฐ ๋‹จ์œ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” integer,string,floating-point์™€ ๊ฐ™์€ ์Šค์นผ๋ผํƒ€์ž…์„ ์ œ๊ณต.
  • ์„œ๋กœ ๋‹ค๋ฅธ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์Šค์นผ๋ผ ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค. (integers/floats/rationals/symbols/keywords/strings/characters/Booleans/regex patterns)
  • ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค~

Numbers

Number๋Š” ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ

  • 0 - 9 ๊นŒ์ง€ ์ˆซ์ž

  • ์†Œ์ˆ˜์ 

  • +, - ๊ธฐํ˜ธ

  • e- ์ง€์ˆ˜ํ‘œํ˜„

  • ์ด๋Ÿฌํ•œ ์š”์†Œ ์ด์™ธ์—๋„, ํด๋กœ์ €์—์„œ ๋‹ค๋ฃจ๋Š” ์ˆซ์ž๋Š” 8์ง„์ˆ˜๋‚˜ 16์ง„์ˆ˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜ํ•œ ์ž„์˜์˜ ์†Œ์ˆ˜์ž๋ฆฌ(M flag)๋‚˜ ์ž„์˜์˜ ํฌ๊ธฐ์˜ ์ •์ˆ˜(N flag)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ต์…˜์„ ํฌํ•จํ•œ๋‹ค.

  • ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ˆซ์ž์˜ ์ •๋ฐ€๋„ (์†Œ์ˆ˜์  ์ดํ•˜)๋Š” host platform, ํ˜น์€ ์ž๋ฐ”์™€ C#์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์–ธ์–ด ์‚ฌ์–‘์— ์˜ํ•ด ์ œํ•œ๋œ๋‹ค. ํด๋กœ์ €๋Š” ์ž„์˜์˜ ์ •๋ฐ€๋„ ์ˆซ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, default๋กœ ํ˜ธ์ŠคํŠธ ์–ธ์–ด (Java ํ˜น์€ Javascript)์˜ ๊ธฐ๋ณธํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค. JVM์˜ ๊ฒฝ์šฐ๋„ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ์‹œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

Integers

  • ๋ชจ๋“  ์ˆซ์ž ์ง‘ํ•ฉ, +,-
  • ํด๋กœ์ €์—์„œ, (์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŠน์ •ํ•œ ํƒ€์ž…์œผ๋กœ๋„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ) ์ผ๋‹จ ๋ถ€ํ˜ธ๋‚˜ ์ˆซ์ž๋กœ ์‹œ์ž‘๋˜์–ด ์ˆซ์ž๋กœ๋งŒ ์ด์–ด์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ž„์˜์˜ ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค.
  • ํด๋กœ์ €์—์„œ 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 ๋ฌธ์ž์ˆ˜)

Floating-point numbers

  • ๋ถ€๋™์†Œ์ˆซ์  ์ˆซ์ž๋Š” ์œ ๋ฆฌ์ˆ˜์˜ ์†Œ์ˆ˜์ „๊ฐœ(!todo:decimal point)
  • ํด๋กœ์ €์˜ integer๊ตฌํ˜„์ฒ˜๋Ÿผ, ์ž„์˜์˜ ์ˆซ์ž (!todo: arbitrarily precise)
  • ๋ถ€๋™์†Œ์ˆซ์  ์ˆซ์ž๋Š” ์ „ํ†ต์ ์ธ ํ˜•์‹์ธ ๋ช‡๊ฐœ์˜ ์ˆซ์ž์™€, ์†Œ์ˆซ์ , ๊ทธ๋ฆฌ๊ณ  ๋ช‡๊ฐœ์˜ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ง
  • ํ•˜์ง€๋งŒ, ๋Œ€๋ฌธ์ž๋‚˜ ์†Œ๋ฌธ์ž E๋กœ ๊ตฌ๋ถ„๋œ ์ง€์ˆ˜๋ถ€๋ถ„์— ๋”ฐ๋ผ์˜ค๋Š” ์œ ํšจ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ณณ์— ์ง€์ˆ˜ํ˜•์‹(๊ณผํ•™์  ๊ธฐ์ˆ˜๋ฒ•)๋„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถ€๋™ ์†Œ์ˆซ์  ์ˆซ์ž์˜ ์˜ˆ
1.17
+1.22
-2.
366e7
32e-14
10.7e-3

์ˆซ์ž๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํฌ๊ฒŒ ๋น„์Šทํ•˜๋‹ค. ์ด์ œ๋Š” ๋ฆฌ์Šต๊ณผ ๋ฆฌ์Šต์˜ ์˜ํ–ฅ์„ ๋ฐ›์€ ์–ธ์–ด๋“ค์˜ ๋šœ๋ ทํ•œ ํŠน์ง•์„ ๊ฐ–๋Š” ์Šค์นผ๋ผํƒ€์ž…์„ ์‚ดํ”ผ์ž!

Rationals

  • ์œ ๋ฆฌ์ˆ˜
  • ํด๋กœ์ €๋Š” ์ •์ˆ˜์™€ ๋ถ€๋™์†Œ์ˆ˜์  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Rational ํƒ€์ž…์„ ์ œ๊ณตํ•œ๋‹ค.
  • Rationalํƒ€์ž…์€ ๋ถ€๋™์†Œ์ˆซ์  ๋ณด๋‹ค ํ‘œํ˜„ํ•˜๊ธฐ์— ์ข€ ๋” ์„ธ๋ฐ€ํ•˜๊ณ  ์ •ํ™•ํ•˜๋‹ค.
  • Rational์€ ๊ณ ์ „์ ์œผ๋กœ ์ •์ˆ˜์˜ ๋ถ„์ž์™€ ๋ถ„๋ชจ๋กœ ํ‘œํ˜„๋˜๊ณ , ๊ทธ๊ฒŒ ํด๋กœ์ €์—์„œ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • Raitional type ์˜ˆ
22/7
-7/22
1028798300297636767687409028872/88829897008789478784
-103/4

ํด๋กœ์ €์—์„œ rational ์ˆซ์ž๋กœ ์•Œ์•„๋‘˜ ๊ฒƒ์€ ๊ทธ๋“ค์€ ๊ฐ€๋Šฅํ•œํ•œ ๋‹จ์ˆœํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. โ€” rational 100/4๋Š” integer 25๋กœ ํ•ด์„ํ•œ๋‹ค.

Symbols

  • ํด๋กœ์ €์—์„œ Symbol์€ ์Šค์Šค๋กœ ๊ทธ ์ž์ฒด์ธ ๊ฐ์ฒด์ด์ง€๋งŒ, ๊ฐ€๋”์€ ๋‹ค๋ฅธ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๊ธฐ๋„ ํ•จ
(def yucky-pi 22/7)
yucky-pi
;;=> 22/7
  • ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด(string)์ด ๊ณ„์‚ฐ๋  ๋•Œ์—๋Š” ์ •ํ™•ํžˆ ๊ฐ™์€ object๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค. ๋ฐ˜๋ฉด symbol์˜ ๊ฒฝ์šฐ, ๊ทธ symbol์ด ํ˜„์žฌ์˜ ๋ฌธ๋งฅ์—์„œ ์ฐธ์กฐํ•˜๋Š” ์–ด๋– ํ•œ ๊ฐ’์ด๋“  ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค. ์ฆ‰, symbol์€ ๋Œ€๊ฐœ ํ•จ์ˆ˜ ์ธ์ž, ์ง€์—ญ๋ณ€์ˆ˜, ์ „์—ญ๋ณ€์ˆ˜๋‚˜ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

Keywords

  • keywords๋Š” ํ•ญ์ƒ ๊ทธ๋“ค ์Šค์Šค๋กœ๋กœ ํŒ๋‹จ(evaluate)์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ ์™ธ์—๋Š” ์‹ฌ๋ณผ๊ณผ ๋น„์Šทํ•˜๋‹ค.
  • ํด๋กœ์ €์—์„œ๋Š” ์‹ฌ๋ณผ๋ณด๋‹ค ํ‚ค์›Œ๋“œ์˜ ์‚ฌ์šฉ์„ ํ›จ์”ฌ ๋” ๋งŽ์ด ๋ณผ ๊ฒƒ์ด๋‹ค.
  • keyword ๋ฌธ๋ฒ•๊ตฌ๋ฌธ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค
:chumby
:2
:?
:ThisIsTheNameOfaKeyword

  • ํ‚ค์›Œ๋“œ ์•ž์— :(์ฝœ๋ก )์ด ๋ถ™์ง€๋งŒ, ์ด๊ฒƒ์€ ๋ฌธ๋ฒ•๊ตฌ๋ฌธ์˜ ์ผ๋ถ€์ด์ง€, ์ด๋ฆ„ ์ž์ฒด์˜ ์ผ๋ถ€๋Š” ์•„๋‹ˆ๋‹ค.

  • ์ž์„ธํ•œ ๊ฒƒ์€ 4.3์—์„œ ์‚ดํ•„ ๊ฒƒ

  • (!todo literal syntax)

Strings

  • ํด๋กœ์ €์˜ string์€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ string๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ‘œํ˜„๋œ๋‹ค.
  • string์€ ์Œ๋”ฐ์˜ดํ‘œ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์—ฐ์†๋œ ๋ฌธ์ž๋“ค์ด๊ณ , ๊ฐœํ–‰ ํฌํ•จ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
"This is a string"
"This is also a
			String"
  • ๋‘˜์€ ์จ์ง„๋ฐ๋กœ ์ €์žฅ๋œ๋‹ค. ํ•˜์ง€๋งŒ REPL์—์„œ ์ถœ๋ ฅํ•  ๋•Œ๋Š”, ๋ณต์ˆ˜ ํ–‰์˜ ์ŠคํŠธ๋ง์€ escape๋ฌธ์ž๋ฅผ ํฌํ•จํ•œ๋‹ค.
"This is also a\n String"

Characters

  • ํด๋กœ์ € 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 ?

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ํด๋กœ์ €์˜ ์Šค์นผ๋ผ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž„๋  ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ํด๋กœ์ €์˜ ์ •๋ง ์žฌ๋ฐŒ๋Š” ์ฝœ๋ ‰์…˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด๋ด…์‹œ๋‹ค.

Putting things together: collections

collection์— ๋Œ€ํ•ด์„  chap5์—์„œ ๋”์šฑ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ํด๋กœ์ € ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์ž(literal) ์ฝœ๋ ‰์…˜๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, list,vectors,maps,sets์— ๋Œ€ํ•ด์„œ ์ตœ์†Œํ•œ์ด๋ผ๋„ ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

List

  • 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์ด ์•„๋‹ˆ๋‹ค.

Vectors

  • list์™€ ๊ฐ™์ด vector๋Š” ๋‚˜์—ด๋œ ๊ฐ’(value)๋“ค์„ ์ €์žฅํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ฐจ์ด์ ์€ 5.4์—์„œ ์„ค๋ช…ํ•  ์˜ˆ์ •์ด์ง€๋งŒ, ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ฅธ ๋‘๊ฐ€์ง€๋Š” ์‚ดํŽด๋ณด์ž.
  • ์ฒซ์งธ, vector๋Š” ๊ฐ์ง„ ๊ด„ํ˜ธ๋ฅผ ์“ฐ๋Š” ๋ฌธ๋ฒ•๊ตฌ๋ฌธ ๊ฐ–๋Š”๋‹ค.
[1 2 :a :b :c]
  • ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ vector๋Š” ๊ฐ ์š”์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ณ„์‚ฐ(evaluate)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๋งคํฌ๋กœ ํ˜ธ์ถœ๋„ ๋ฒกํ„ฐ ์ž์ฒด์—์„œ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ํŠน์ • ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฒกํ„ฐ ๋‚ด๋ถ€์— ์žˆ์„ ๋•Œ, ๊ทธ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค. ๋ฆฌ์ŠคํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฒกํ„ฐ๋Š” heterogeneousํ•œ ํƒ€์ž…์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋น„์–ด ์žˆ๋Š” ๋ฒกํ„ฐ []๋Š” nil์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

Maps

  • 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

  • Sets์€ 0๊ฐœ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ์œ ์ผํ•œ ์š”์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
  • ํ•ด์‹œ(#)๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ค‘๊ด„ํ˜ธ์™€ ์“ฐ์ธ๋‹ค.
#{1 2 "three" :four 0x5}
  • ๋น„์–ด์žˆ๋Š” Set #{}๋Š” nil์ด ์•„๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๊ธฐ๋ณธ์ ์ธ collectionํƒ€์ž…์˜ ์ „๋ถ€๋‹ค. Chap4์—์„œ ๊ฐ ํƒ€์ž…์˜ ์žฅ๋‹จ์ ๊ณผ queue๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

Making things happen: Calling functions

  • ํด๋กœ์ €์—์„œ ํ•จ์ˆ˜๋Š” 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 ๋˜๋Š” ์™„์ „ํžˆ ๊ด„ํ˜ธ๋กœ ์‹ธ์—ฌ์ง„ ํ‘œ๊ธฐ๋ฅผ ์“ด๋‹ค.
  • ์ด ๊ท ์ผํ•œ ๊ตฌ์กฐ๋Š” ๋ฆฌ์Šต๊ฐ™์€ ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋†€๋ผ์šด ์œ ์—ฐํ•จ์— ๊ธฐ์ดˆํ•œ๋‹ค.

Vars are not variables

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๋ณ€์ˆ˜(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.

Functions

Locals, loops, and blocks

Preventing things from happening: quoting

Using host libraries via interop

Clojure๋Š” ์ž๋ฐ”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์ž๋ฐ”์˜ ํด๋ž˜์Šค๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Static ํด๋ž˜์Šค ๋งด๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ

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 ๋งคํฌ๋กœ

  • 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์žฅ์—์„œ ๋‹ค๋ฃธ)

Exceptional circumstances

์˜ˆ์™ธ ์ฒ˜๋ฆฌ์—๋Š” 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"

Modularizing code with namespaces

Clojure์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํ•จ์ˆ˜, ๋งคํฌ๋กœ, ๊ฐ’๋“ค์„ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

ns๋ฅผ ์ด์šฉํ•ด์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ

  • ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ 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๋ฅผ ์ด์šฉํ•ด์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด 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
  • ํ˜ผ๋ž€์Šค๋Ÿฝ์ง€ ์•Š๊ฒŒ ์•Œ์•„์„œ ์ž˜ ์“ฐ์ž

:refer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งคํ•‘์„ ๋งŒ๋“ค๊ณ  ๋กœ๋”ฉํ•˜๊ธฐ

  • ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ˜„์žฌ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋งคํ•‘ํ•ด์„œ ์“ฐ๋ฉด ํŽธ๋ฆฌํ•œ๋ฐ ์ด๋ฅผ ์œ„ํ•ด :require์˜ :refer ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค.
(ns joy.use-ex
  (:require [clojure.string :refer (capitalize)]))
(map capitalize ["kilgore" "trout"])
;=> ("Kilgore" "Trout")
  • :refer๋ฅผ ํ• ๋•Œ ์ถ”์ฒœํ•˜์ง€ ์•Š์ง€๋งŒ :all ๊ฐ’์œผ๋กœ ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ• ์ˆ˜ ์žˆ๋‹ค. (์˜ˆ์ „์—๋Š” :use๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.)

:refer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งคํ•‘ ๋งŒ๋“ค๊ธฐ

  • :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๋กœ ์ž๋ฐ” ํด๋ž˜์Šค ๋กœ๋”ฉํ•˜๊ธฐ

  • :import๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒจํ‚ค์ง€๋ช…์„ ๋‹ค ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
(ns joy.java
          (:import [java.util HashMap]
                   [java.util.concurrent.atomic AtomicLong]))
(HashMap. {"happy?" true})
;=> {"happy?" true}
(AtomicLong. 42)
;=> 42
  • java.lang์€ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
Clone this wiki locally