Skip to content

Commit

Permalink
add: ch04/lesson_04.md
Browse files Browse the repository at this point in the history
  • Loading branch information
netpyoung committed Jan 22, 2024
1 parent 5a2d07d commit 0e7bfeb
Showing 1 changed file with 110 additions and 0 deletions.
110 changes: 110 additions & 0 deletions src/ch03/lesson_04.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# ๋ ˆ์Šจ 04. ์กฐ๋ฆฝ๊ณผ ๋ถ„ํ•ด

- [์›๋ฌธ](https://dept-info.labri.fr/~strandh/Teaching/MTP/Common/David-Lamkins/chapter03-04.html)

## CONS

`cons`๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๋ฏ€๋กœ ์ด์˜ ์ธ์ž๋“ค์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ์—๋Š” `cons`์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ `๋ฆฌ์ŠคํŠธ` ํ˜น์€ `NIL`์ด ๋“ค์–ด์˜ฌ๊ฒƒ์ž…๋‹ˆ๋‹ค.

``` lisp
(cons 1 nil)
;;=> (1)
(cons 2 (cons 1 nil))
;;=> (2 1)
(cons 3 (cons 2 (cons 1 nil)))
;;=> (3 2 1)
```

`cons`๋Š” ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋น„์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ `( )` ๋Š” `NIL`๊ณผ ๋™์ผํ•˜๋ฉฐ,

``` txt
( ) == NIL
```

๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

``` lisp
(cons 1 ())
;;=> (1)
(cons 2 (cons 1 ()))
;;=> (2 1)
(cons 3 (cons 2 (cons 1 ())))
;;=> (3 2 1)
```

ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋ฉด, ๋งž์Šต๋‹ˆ๋‹ค, `NIL`์—๋Š” ๋ญ”๊ฐ€ ํŠน๋ณ„ํ•œ ๋Šฅ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. `NIL`์€ ํ‚ค์›Œ๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ž๊ธฐ ์ž์‹ ์„ ์ƒ์ˆ˜ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ๋ฆฌ์Šคํ”„์˜ ๋‘๊ฐœ์˜ ์‹ฌ๋ณผ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์‹ฌ๋ณผ์€ `T`์ž…๋‹ˆ๋‹ค.

`( ) == NIL`์ด๋ž€ ๊ฒƒ๊ณผ `NIL`์ด ์Šค์Šค๋กœ ํ‰๊ฐ€๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ข…ํ•ฉํ•ด๋ณด๋ฉด, ์ด๋Š” `(quote ())`๋ฅผ `()`๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ฆฌ์Šคํ”„๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ‰๊ฐ€ ๊ทœ์น™์— ์˜ˆ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


## LIST

์•„๋งˆ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ˆˆ์น˜์ฑ—๋‹ค๋ฉด, ์ค‘์ฒฉ๋œ `cons` ํผ์œผ๋กœ๋„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ์ง€๋ฃจํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. `list` ํผ์€ ์ข€๋” ๋ช…๋ฃŒํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ผํ•œ ์ผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

``` lisp
(list 1 2 3)
;;=> (1 2 3)
```

`list`๋Š” ์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `list`๋Š” ํ•จ์ˆ˜์ด๊ธฐ์—, ์ด๋Š” ์ธ์ž๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

``` lisp
(list 1 2 :hello "there" 3)
;;=> (1 2 :HELLO "there" 3)
(let ((a :this)
(b :and)
(c :that))
(list a 1 b c 2))
;;=> (:THIS 1 :AND :THAT 2)
```

## **FIRST**์™€ **REST**

๋ฆฌ์ŠคํŠธ๊ฐ€ (์ฒซ๋ฒˆ์งธ์™€ ๋‚˜๋จธ์ง€) ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ `first`์™€ `rest` ๋‘ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐœ๋ณ„ ์›์†Œ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

``` lisp
(setq my-list (quote (1 2 3 4 5)))
;;=> (1 2 3 4 5)
(first my-list)
;;=> 1
(rest my-list)
;;=> (2 3 4 5)
(first (rest my-list))
;;=> 2
(rest (rest my-list))
;;=> (3 4 5)
(first (rest (rest my-list)))
;;=> 3
(rest (rest (rest my-list)))
;;=> (4 5)
(first (rest (rest (rest my-list))))
;;=> 4
```

`first`์™€ `rest` ํ•จ์ˆ˜๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ์—ฎ๋Š” ๊ฒƒ์€ ๋ถ„๋ช… ์ง€๋ฃจํ•œ ์ž‘์—…์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜, ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฒ•์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠน์ • ์š”์†Œ๋งŒ์„ ์„ ํƒํ•˜๊ณ ์ž ํ• ๋•Œ๋‚˜ ํ˜น์€ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ๋ฌดํ•œ์ผ๋•Œ ์ž˜ ๋จนํžˆ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 4์žฅ[p 84] ์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ• ๋•Œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— 13์žฅ์—์„œ [p 150], ๋ฆฌ์Šคํ”„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ํ˜น์€ ์‹œํ€€์Šค ์† ์š”์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์„ ์‚ดํŽด ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค

`first`์™€ `rest`๋Š” ๊ฝค ์ตœ๊ทผ ๋™์•ˆ ํ™œ์•ฝํ•ด์˜จ `car`์™€ `cdr` ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์–ด ๋ฆฌ์Šคํ”„์— ์ถ”๊ฐ€๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ฆฌ์Šคํ”„ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์—์„œ `car`์™€ `cdr`์˜ ์ด๋ฆ„์ด ์œ ๋ก€๋ฌ๊ณ , ์ด ์ด๋ฆ„์— ๊ธฐ๋ฐ˜ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ์ด๋ฏธ ์˜ค๋ž˜์ „์— ๋ฐ”๋€Œ์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ˆ˜์‹ญ๋…„๊ฐ„ ๊ณ ์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค


## ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ

- `cons`
- `list`
- `first`
- `rest`
- `car`
- `cdr`
- `nil` , `( )`
- `T`

0 comments on commit 0e7bfeb

Please sign in to comment.