• 검색 결과가 없습니다.

구조가 있는 값 만들기

N/A
N/A
Protected

Academic year: 2021

Share "구조가 있는 값 만들기"

Copied!
10
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

구조가 있는 값 만들기

• 지금까지 만들 수 있었던 값의 종류

– 기초타입의 값들 : int, bool, string – 함수타입의 값들 : t->t

• 복합적인 것들을 어떻게 만들지 ?

– 만든 값들을 가지고 조립해서 만들고 싶다 !

– 짝 / 튜플 tuple: int*int, string*int*(int->bool)

(2)

구조물 만들기 + 구조물 사용 하기

<expr> ::= ...

| (cons <expr> <expr>) | (car <expr>)

| (cdr <expr>)

| (null? <expr>)

| ()

(3)

• (cons 1 2)

• (cons 1 (cons 2 ()))

• (car <expr>) (cdr <expr>)

1 2

1 2

car cdr

(4)

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

(5)

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> ())…)

(6)

‘<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>)

(7)

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

(8)

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

(9)

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

(10)

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.

– 따라서 , 프로그램은 실행중에 갑자기 멈출수 있다 . – 어쩔 것인가 ? 해결할 방법이 무엇일까 ?

참조

관련 문서

재료라는 것은 물체를 만들기 위해 사용되는 작은 물질들을 의미하는 것인데, 그렇다면 이렇게 큰 건물에 많은 연구자와 기술자들이 과연 무엇을 연구하거나 만들기

재료라는 것은 물체를 만들기 위해 사용되는 작은 물질들을 의미하는 것인데, 그렇다면 이렇게 큰 건물에 많은 연구자와 기술자들이 과연 무엇을 연구하거나 만들기

재료라는 것은 물체를 만들기 위해 사용되는 작은 물질들을 의미하는 것인데, 그렇다면 이렇게 큰 건물에 많은 연구자와 기술자들이 과연 무엇을 연구하거나 만들기

재료라는 것은 물체를 만들기 위해 사용되는 작은 물질들을 의미하는 것인데, 그렇다면 이렇게 큰 건물에 많은 연구자와 기술자들이 과연 무엇을 연구하거나 만들기

하나는 기술중심의 방법으로 학생 들이 생물의 특성과 적용된 과학원리와 기술을 익힌 다음에 그 원리가 적용될만한 필요한 삶의 영역을 찾아가는 프로세스입니다

전세계인들이 쉽게 알아볼 수 있는 유니버셜 자동차 번호판을 구상하고 만들기.. 인지공학 관련 직업을 탐색하고 선택하기 위 해

우리는 이 스마트 새집 만들기 활동을 통해 자연과 더 가까워질 수 있는 시간을

또 일본 사람들은 땅속에 성질이 사나운 거대한 메기가 살고 있어서 신이 이 메기를 돌로 꾹 눌러 놓았는데, 신의 감시가 소홀한 틈을 타 날뛰면 지진이