구조가 있는 값 만들기
• 지금까지 만들 수 있었던 값의 종류
– 기초타입의 값들 : int, bool, string – 함수타입의 값들 : t->t
• 복합적인 것들을 어떻게 만들지 ?
– 만든 값들을 가지고 조립해서 만들고 싶다 !
– 짝 / 튜플 tuple: int*int, string*int*(int->bool)
구조물 만들기 + 구조물 사용 하기
<expr> ::= ...
| (cons <expr> <expr>) | (car <expr>)
| (cdr <expr>)
| (null? <expr>)
| ()
• (cons 1 2)
• (cons 1 (cons 2 ()))
• (car <expr>) (cdr <expr>)
1 2
1 2
car cdr
Types
• cons : t1 * t2 -> (t1 t2)pair
• car : (t1 t2)pair -> t1
• cdr : (t1 t2)pair -> t2
• (): nil
(cons 1 #t) : (int bool)pair (cons 1 2) : (int int)pair (car (cons 1 2)) : int
(cdr (cons 1 2)) : int
(cons 1 ()) : (int nil)pair
(cons 2 (cons 1 ())): (int (int nil)pair)pair
introduction for (t1 t2)pair elimination for (t1 t2)pair
list: sugar for nested cons
• (list) = ()
• (list 1) = (cons 1 ())
• (list 1 2)
= (cons 1 (cons 2 ()))
• (list <e1> <e2> … <eN>)
= (cons <e1>(cons <e2>
…
(cons <eN> ())…)
‘<exp>: sugar for (quote
<exp>)
• (quote <exp>)
does not evaluate <exp>;
return <exp> as it is
• ‘<exp> = (quote <exp>)
• ‘<name> evaluates to <name>, not its value
• ‘(1 2 3) = (quote (1 2 3)) = (list ‘1 ‘2 ‘3)
• ‘(x y z) = (quote (x y z)) = (list ‘x ‘y ‘z)
• ‘(<e1> … <eN>) = (quote (<e1>…<eN>))
= (list ‘<e1> … ‘<eN>)Types
• int-list = int 가 0 개 이상 있는 리스트
= nil | (int nil)pair | (int (int nil)pair)pair | … = nil | (int int-list)pair
• int-list 를 만드는 방법 2 가지 :
– nil 값
– int 값을 int-list 값의 앞에 붙인것
• () : t-list
• cons : t * t-list -> t-list
• car : t-list -> t
• cdr : t-list -> t-list
• null? : t-list -> bool (cons 1 ()) : int-list
(cons 2 (cons 1 ())): int-list
Types
• 타입 t+t’ list = t 혹은 t’ 원소가 0 개 이상 있는 리스트 = nil | (t+t’ nil)pair | (t+t’ (t+t’ nil)pair)pair | …
= nil | (t+t’ (t+t’ list))pair
‘(1 #t) : int+bool list
• () : t+t’ list
• cons : (t+t’) * (t+t’ list) -> t+t’ list
• car : t+t’ list -> t+t’
• cdr : t+t’ list -> t+t’ list
• null? : t+t’ list -> bool
(cons “a” (cons 1 ())) : (string+int) list (car (cons “a” (cons 1 ()))) : string
Typeful programming
(define (aging animal) (define (add-age x)
(cond ((is-name? x) (string-append x “ 님” )) ((is-integer? x) (+ x 1))
))
(if (null? animal) ()
(cons (add-age (car animal)) (aging (cdr animal))
) ) )
case analysis
on types
Type-safe programming
(define (aging animal) (define (add-age x)
(cond ((is-name? x) (string-append x “ 님” )) ((is-integer? x) (+ x 1))
))
(if (null? animal) () …))
• 위의 aging 함수가 불릴때 전달되는 animal list 는 항상 이름 또는 정수 만 원소로 가지고 있는가 ?
– Your program is type-safe.
• 혹시 그렇지 않다면 ? 위의 두 테스트 케이스는 충분하지 않다면 ? 잘 모 르겠으면 ?
– Your program is not type-safe.
– 따라서 , 프로그램은 실행중에 갑자기 멈출수 있다 . – 어쩔 것인가 ? 해결할 방법이 무엇일까 ?