SlideShare a Scribd company logo
1.3장 차수 높은 프로시저 
(higher order procedure) 
로 요약하는 방법 
SICP 
아꿈사 - 우주미아홍구
1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법
1.3장 차수 높은 프로시저(higher order procedure)로 
요약하는 방법 
되풀이 되는 계산 방법을 간추리거나, 
프로시저를 인자로 받거나, 
프로시저를 결과 값으로 되돌려 주는, 
차수 높은 프로시저 : 데이터 처럼 사용하는 프로시저 
계산 방법을 요약 간추리는 프로시저 
(제네릭?,STL?,NS?)
1.3.1 프로시저를 인자로 받는 프로시저 
(define (만드려는프로시저명 인자 인자) 
프로시저 프로시저 인자 프로시저 인자)
1.3.1 프로시저를 인자로 받는 프로시저 
a~b 까지 정수의 합을 계산하는 프로시저 
(define (sum-integers a b)) 
(if (> a b) 
0 
(+ a (sum-integers (+ a 1) b))))
1.3.1 프로시저를 인자로 받는 프로시저 
시그마 ( 수열의 덧셈 ) 프로시저 
(define (<name> a b)) 
(if (> a b) 
0 
(+ (<term> a) 
(<name> (<next> a) b))))
1.3.1 프로시저를 인자로 받는 프로시저 
(define (identity x) x) 
(define (inc n) (+n 1)) 
(define (sum term a next b) 
(if (> a b) 
0 
(+ (term a) 
(sum term (next a) next b)))) 
(define (sum-intergers a b)) 
(sum identity a inc b))
1.3.1 프로시저를 인자로 받는 프로시저 
(define (identity x) x) 
(define (inc n) (+n 1)) 
(define (sum term a next b) 
(if (> a b) 
0 
(+ (term a) 
(sum term (next a) next b)))) 
(define (sum-intergers a b)) 
(sum identity a inc b))
1.3.1 프로시저를 인자로 받는 프로시저 
(define (identity x) x) 
(define (inc n) (+n 1)) 
(define (sum term a next b) 
(if (> a b) 
0 
(+ (term a) 
(sum term (next a) next b)))) 
(define (sum-intergers a b)) 
(sum identity a inc b))
1.3.1 프로시저를 인자로 받는 프로시저 
(define (identity x) x) 
(define (inc n) (+n 1)) 
(define (sum term a next b) 
(if (> a b) 
0 
(+ (term a) 
(sum term (next a) next b)))) 
(define (sum-intergers a b)) 
(sum identity a inc b))
1.3.2 lambda로 나타내는 프로시저 
임시 함수 
ex) (define (identity x) x) 
define 해서 하나하나 만들기 귀찮다! 
lambda를 쓰면 작은 프로시저는 따로 만들지 않아도!!
1.3.2 lambda로 나타내는 프로시저 
(define (plus4 x) (+ x 4)) 
(define plus4 (lambda (x) (+ x 4))) 
(lambda (<parameters>) <body>)
1.3.2 lambda로 나타내는 프로시저 
간단히 연습 lambda 
(define (square z) (z x z)) 
((lambda (x y z) (+ x y (square z))) 1 2 3) 
= ?
1.3.2 lambda로 나타내는 프로시저 
간단히 연습 lambda 
(define (square z) (z x z)) 
((lambda (x y z) (+ x y (square z))) 1 2 3) 
= ?
1.3.2 lambda로 나타내는 프로시저 
간단히 연습 lambda 
(define (square z) (x z z)) 
((lambda (x y z) (+ x y (square z))) 1 2 3) 
= (+ 1 2 (x 3 3)) 
= 12
1.3.2 lambda로 나타내는 프로시저 
let으로 갇힌 변수 만들기 
프로시저 안에서만 쓰는 변수(로컬변수) 
각각의 리스트가 값을 가지고 바디에 적용 
(let ((<var1> <exp1>) 
(<var2> <exp2>) 
… 
(<varn> <expn>)) 
<body>)
1.3.2 lambda로 나타내는 프로시저 
let으로 갇힌 변수 만들기 
각각의 리스트가 값을 가지고 바디에 적용 
let 외부에서 x는 2라면 
(let (x 3) 
(y (+ x 2)) 
(* x y)) 
let 안에서 첫번째 리스트 x는 3 
y는 외부의 x를 사용해서 2
1.3.2 lambda로 나타내는 프로시저 
let으로 갇힌 변수 만들기 
각각의 리스트가 값을 가지고 바디에 적용 
let 외부에서 x는 2라면 
(let (x 3) //x = 3 
(y (+ x 2)) //x = 2 (외부) 
(* x y)) 
let 안에서 첫번째 리스트 x는 3 
y는 외부의 x를 사용해서 2
1.3.2 lambda로 나타내는 프로시저 
let으로 갇힌 변수 만들기 
각각의 리스트가 값을 가지고 바디에 적용 
let 외부에서 x는 2라면 
(let (x 3) //x = 3 
(y (+ x 2)) //x = 2 (외부) 
(* x y)) 
let 안에서 첫번째 리스트 x는 3 
y는 외부의 x를 사용해서 2 
결국 body 에는 (* 3 4) => 12
1.3.3 일반적인 방법을 표현하는 프로시저 
수뿐 아니라 함수까지 인자로 받아 
계산하는 방법만 도려내어 프로시저로 간추림
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (serarch f neg-point pos-point) 
(let ((midpoint (average neg-point pos-point))) //가운데 값 정의 
(if (close-enough? neg-point pos-point) //값이 근사치인가 
midpoint //맞으면 리턴 
(let ((test-value (f midpoint))) //아니면 중간값 사용 
(cond ((positive? test-value) //0보다 큰가 
(serarch f neg-point midpoint) //가까운값 
((negative? test-value) //0보다 작은가 
(serarch f midpoint pos-point)) //먼값 
(else midpoint)))))) //둘다 아니면 중간값
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (serarch f neg-point pos-point) 
(let ((midpoint (average neg-point pos-point))) //가운데 값 정의 
(if (close-enough? neg-point pos-point) //값이 근사치인가 
midpoint //맞으면 리턴 
(let ((test-value (f midpoint))) //아니면 중간값 사용 
(cond ((positive? test-value) //0보다 큰가 
(serarch f neg-point midpoint) //가까운값 
((negative? test-value) //0보다 작은가 
(serarch f midpoint pos-point)) //먼값 
(else midpoint)))))) //둘다 아니면 중간값
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (close-enough? x y) // 근접 한가 
(< (abs (- x y)) 0.001))
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (serarch f neg-point pos-point) 
(let ((midpoint (average neg-point pos-point))) //가운데 값 정의 
(if (close-enough? neg-point pos-point) //값이 근사치인가 
midpoint //맞으면 리턴 
(let ((test-value (f midpoint))) //아니면 중간값 사용 
(cond ((positive? test-value) //0보다 큰가 
(serarch f neg-point midpoint) //가까운값 
((negative? test-value) //0보다 작은가 
(serarch f midpoint pos-point)) //먼값 
(else midpoint)))))) //둘다 아니면 중간값
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (serarch f neg-point pos-point) 
(let ((midpoint (average neg-point pos-point))) //가운데 값 정의 
(if (close-enough? neg-point pos-point) //값이 근사치인가 
midpoint //맞으면 리턴 
(let ((test-value (f midpoint))) //아니면 중간값 사용 
(cond ((positive? test-value) //0보다 큰가 
(serarch f neg-point midpoint) //가까운값 
((negative? test-value) //0보다 작은가 
(serarch f midpoint pos-point)) //먼값 
(else midpoint)))))) //둘다 아니면 중간값
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (serarch f neg-point pos-point) 
(let ((midpoint (average neg-point pos-point))) //가운데 값 정의 
(if (close-enough? neg-point pos-point) //값이 근사치인가 
midpoint //맞으면 리턴 
(let ((test-value (f midpoint))) //아니면 중간값 사용 
(cond ((positive? test-value) //0보다 큰가 
(serarch f neg-point midpoint) //가까운값 
((negative? test-value) //0보다 작은가 
(serarch f midpoint pos-point)) //먼값 
(else midpoint)))))) //둘다 아니면 중간값
1.3.3 일반적인 방법을 표현하는 프로시저 
이분법으로 방정식의 근 찾기 
f(a) < 0 < f(b) 
f(x) > 0 일때 f의 근은 a와 x 사이에 있음 
f(x) < 0 일때 f의 근은 b와 x 사이에 있음 
분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 
(define (serarch f neg-point pos-point) 
(let ((midpoint (average neg-point pos-point))) //가운데 값 정의 
(if (close-enough? neg-point pos-point) //값이 근사치인가 
midpoint //맞으면 리턴 
(let ((test-value (f midpoint))) //아니면 중간값 사용 
(cond ((positive? test-value) //0보다 큰가 
(serarch f neg-point midpoint) //가까운값 
((negative? test-value) //0보다 작은가 
(serarch f midpoint pos-point)) //먼값 
(else midpoint)))))) //둘다 아니면 중간값
1.3.4 프로시저를 만드는 프로시저 
프로시저를 프로시저의 결과 값으로 돌려주는 
표현력의 상승 효과!! 
(define average-dump f) 
(lambda (x) (average x (f x)))) 
((average-dump square) 10)
1.3.4 프로시저를 만드는 프로시저 
프로시저를 프로시저의 결과 값으로 돌려주는 
표현력의 상승 효과!! 
(define average-dump f) 
(lambda (x) (average x (f x)))) 
((average-dump square) 10) 
(10 + 100) / 2 => 55
벌써 마무으리… 
프로그래머는 언제나 스스로 짠 프로그램을 놓고 
그 속에서 간추릴 게 무엇인지 찾아내어(리팩토링-냄새?), 
이로부터 더 수준 높은 표현 수단을 만들어 내려고 애써야 한다(추상화?)
벌써 마무으리… 
몇 가지 문제 풀이 방법을 간추려서 
다른 문제 풀이에도 다시 쓸수 있도록 
일반적인 표현 수단을 만들려고 
애쓰는 버릇은 정말 중요하다 
(재사용?,일반화?,제네릭?)
정리 
프로그래밍 언어의 일등급(first class) 
(프로시저가) 변수의 값(처럼 사용될 수)이 될 수 있다. 
다시 말해, 이름이 붙을 수 있다. 
(프로시저가) 프로시저의 인자로 쓸 수 있다. 
(프로시저가) 프로시저의 결과로 만들어질 수 있다. 
(프로시저가) 데이터 구조속에 집어 넣을수 있다.

More Related Content

PDF
6장 표현식 및 문장
재정 이
 
PDF
이산치2번
kangseungwoo
 
PDF
2012 Dm A0 02 Pdf
kd19h
 
PDF
Python3 10장 문자열이야기
Jihoon Kong
 
PPTX
파이썬+정규표현식+이해하기 20160301
Yong Joon Moon
 
PDF
정규표현식 Regular expression (regex)
Sunyoung Kim
 
PDF
Data Structure - 1st Study
Chris Ohk
 
PDF
2012 Ds 03
Jungyerin
 
6장 표현식 및 문장
재정 이
 
이산치2번
kangseungwoo
 
2012 Dm A0 02 Pdf
kd19h
 
Python3 10장 문자열이야기
Jihoon Kong
 
파이썬+정규표현식+이해하기 20160301
Yong Joon Moon
 
정규표현식 Regular expression (regex)
Sunyoung Kim
 
Data Structure - 1st Study
Chris Ohk
 
2012 Ds 03
Jungyerin
 

What's hot (20)

PPTX
Regex
Kangwook Lee
 
PDF
초보자를 위한 정규 표현식 가이드 (자바스크립트 기준)
민태 김
 
PPTX
R 프로그래밍 기본 문법
Terry Cho
 
PPT
Python3 brief summary
HoChul Shin
 
PDF
2012 Ds D2 03
chl132435
 
PDF
2012 Ds D2 03 Pdf
kd19h
 
PPTX
R 기본-데이타형 소개
Terry Cho
 
PDF
Haskell study 5
Nam Hyeonuk
 
PDF
Haskell study 10
Nam Hyeonuk
 
PDF
정규표현식(Regular expressions)
Juhee Kim
 
PDF
Haskell study 13
Nam Hyeonuk
 
PDF
알고리즘과 자료구조
영기 김
 
PDF
04장 고급변수 사용
유석 남
 
PDF
Haskell study 2
Nam Hyeonuk
 
PDF
타임리프 폼과 어노테이션.Key
Seokju Hong
 
PDF
Haskell study 4
Nam Hyeonuk
 
PPTX
포인터와 배열
Kim YoSep
 
PDF
Cp2 w5
웅식 전
 
PDF
How to Study Mathematics for ML
Dataya Nolja
 
PDF
2012 Dm 07
Jungyerin
 
초보자를 위한 정규 표현식 가이드 (자바스크립트 기준)
민태 김
 
R 프로그래밍 기본 문법
Terry Cho
 
Python3 brief summary
HoChul Shin
 
2012 Ds D2 03
chl132435
 
2012 Ds D2 03 Pdf
kd19h
 
R 기본-데이타형 소개
Terry Cho
 
Haskell study 5
Nam Hyeonuk
 
Haskell study 10
Nam Hyeonuk
 
정규표현식(Regular expressions)
Juhee Kim
 
Haskell study 13
Nam Hyeonuk
 
알고리즘과 자료구조
영기 김
 
04장 고급변수 사용
유석 남
 
Haskell study 2
Nam Hyeonuk
 
타임리프 폼과 어노테이션.Key
Seokju Hong
 
Haskell study 4
Nam Hyeonuk
 
포인터와 배열
Kim YoSep
 
Cp2 w5
웅식 전
 
How to Study Mathematics for ML
Dataya Nolja
 
2012 Dm 07
Jungyerin
 
Ad

Viewers also liked (15)

PDF
자존감 탐구생활 - 박제영
Jinho Jung
 
PDF
I Hope There Fore I Am Seoung Eun Lee
Keynote User Group
 
PDF
[KUG PP 32nd] Be Good to Yourself (by TonyAdams6)
Keynote User Group
 
PDF
[KUG Award 2009] iPhone, I Put My Dream Into My Hand Enhanced Version Sungjin...
Keynote User Group
 
PDF
[KUG PP 31st] Self Esteem (by 천재님)
Keynote User Group
 
PDF
창조경제(30분)
Min Hwa Lee
 
PDF
Back to i keynote
Keynote User Group
 
PDF
[Ignite 강남 2016] 천성권 지속가능한 딸바보로 살기
Jinho Jung
 
PDF
창업자연대보증
Min Hwa Lee
 
PDF
디포커스 전홍구
Newsjelly
 
PDF
이민화의기업가정신
Min Hwa Lee
 
PDF
The Power of Visual Storytelling
NewsCred
 
PDF
Storytelling 101
Ethos3
 
PDF
Visual Storytelling 101
JESS3
 
PDF
40 Tools in 20 Minutes: Hacking your Marketing Career
Eric Leist
 
자존감 탐구생활 - 박제영
Jinho Jung
 
I Hope There Fore I Am Seoung Eun Lee
Keynote User Group
 
[KUG PP 32nd] Be Good to Yourself (by TonyAdams6)
Keynote User Group
 
[KUG Award 2009] iPhone, I Put My Dream Into My Hand Enhanced Version Sungjin...
Keynote User Group
 
[KUG PP 31st] Self Esteem (by 천재님)
Keynote User Group
 
창조경제(30분)
Min Hwa Lee
 
Back to i keynote
Keynote User Group
 
[Ignite 강남 2016] 천성권 지속가능한 딸바보로 살기
Jinho Jung
 
창업자연대보증
Min Hwa Lee
 
디포커스 전홍구
Newsjelly
 
이민화의기업가정신
Min Hwa Lee
 
The Power of Visual Storytelling
NewsCred
 
Storytelling 101
Ethos3
 
Visual Storytelling 101
JESS3
 
40 Tools in 20 Minutes: Hacking your Marketing Career
Eric Leist
 
Ad

Similar to 1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법 (20)

PDF
3 Generative models for discrete data
Jungkyu Lee
 
PDF
Tda jisu kim
NAVER Engineering
 
PDF
Code로 이해하는 RNN
SANG WON PARK
 
PPTX
파이썬+Operator+이해하기 20160409
Yong Joon Moon
 
PPT
부울 대수와 컴퓨터 논리
suitzero
 
PPTX
python 수학이해하기
Yong Joon Moon
 
PPTX
파이썬 문자열 이해하기
Yong Joon Moon
 
PPTX
파이썬 문자열 이해하기
Yong Joon Moon
 
PDF
2012 Dm A0 02 Pdf
jinwookhong
 
PDF
R 시작해보기
SEUNGWOO LEE
 
PDF
DP 알고리즘에 대해 알아보자.pdf
Ho Jeong Im
 
PDF
Adversarial Attack in Neural Machine Translation
HyunKyu Jeon
 
PDF
Wasserstein GAN 수학 이해하기 I
Sungbin Lim
 
PDF
Rdatamining
Kangwook Lee
 
PPTX
파이썬정리 20160130
Yong Joon Moon
 
PPT
Equation Solving
Jeong-Hoon Mo
 
PDF
스칼라와 스파크 영혼의 듀오
Taeoh Kim
 
PDF
2.supervised learning
Haesun Park
 
PDF
RUCK 2017 베이즈 모형의 꽃 - 계층 모형
r-kor
 
PPTX
환경계산법
Jaemin Seo
 
3 Generative models for discrete data
Jungkyu Lee
 
Tda jisu kim
NAVER Engineering
 
Code로 이해하는 RNN
SANG WON PARK
 
파이썬+Operator+이해하기 20160409
Yong Joon Moon
 
부울 대수와 컴퓨터 논리
suitzero
 
python 수학이해하기
Yong Joon Moon
 
파이썬 문자열 이해하기
Yong Joon Moon
 
파이썬 문자열 이해하기
Yong Joon Moon
 
2012 Dm A0 02 Pdf
jinwookhong
 
R 시작해보기
SEUNGWOO LEE
 
DP 알고리즘에 대해 알아보자.pdf
Ho Jeong Im
 
Adversarial Attack in Neural Machine Translation
HyunKyu Jeon
 
Wasserstein GAN 수학 이해하기 I
Sungbin Lim
 
Rdatamining
Kangwook Lee
 
파이썬정리 20160130
Yong Joon Moon
 
Equation Solving
Jeong-Hoon Mo
 
스칼라와 스파크 영혼의 듀오
Taeoh Kim
 
2.supervised learning
Haesun Park
 
RUCK 2017 베이즈 모형의 꽃 - 계층 모형
r-kor
 
환경계산법
Jaemin Seo
 

More from 홍준 김 (15)

PPTX
11장 윈도우 스레드 풀 + 12장 파이버
홍준 김
 
PPTX
11장 윈도우 스레드 풀
홍준 김
 
KEY
Html5&css 3장
홍준 김
 
PDF
Mongo db문서의생성,갱신,삭제
홍준 김
 
KEY
Taocp 2.3.5
홍준 김
 
KEY
Taocp 2.3
홍준 김
 
KEY
Taocp 2.1~2.2
홍준 김
 
KEY
Taocp
홍준 김
 
KEY
재테크
홍준 김
 
KEY
ManagingHumans/chap25~29
홍준 김
 
KEY
DebugIt/chapter9~11
홍준 김
 
KEY
Holub on Patterns 1장 전
홍준 김
 
PPT
2장 상태구도형 에이전트의 디자인
홍준 김
 
KEY
5장
홍준 김
 
PPT
프로그램은 왜 실패 하는가
홍준 김
 
11장 윈도우 스레드 풀 + 12장 파이버
홍준 김
 
11장 윈도우 스레드 풀
홍준 김
 
Html5&css 3장
홍준 김
 
Mongo db문서의생성,갱신,삭제
홍준 김
 
Taocp 2.3.5
홍준 김
 
Taocp 2.3
홍준 김
 
Taocp 2.1~2.2
홍준 김
 
Taocp
홍준 김
 
재테크
홍준 김
 
ManagingHumans/chap25~29
홍준 김
 
DebugIt/chapter9~11
홍준 김
 
Holub on Patterns 1장 전
홍준 김
 
2장 상태구도형 에이전트의 디자인
홍준 김
 
프로그램은 왜 실패 하는가
홍준 김
 

1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법

  • 1. 1.3장 차수 높은 프로시저 (higher order procedure) 로 요약하는 방법 SICP 아꿈사 - 우주미아홍구
  • 3. 1.3장 차수 높은 프로시저(higher order procedure)로 요약하는 방법 되풀이 되는 계산 방법을 간추리거나, 프로시저를 인자로 받거나, 프로시저를 결과 값으로 되돌려 주는, 차수 높은 프로시저 : 데이터 처럼 사용하는 프로시저 계산 방법을 요약 간추리는 프로시저 (제네릭?,STL?,NS?)
  • 4. 1.3.1 프로시저를 인자로 받는 프로시저 (define (만드려는프로시저명 인자 인자) 프로시저 프로시저 인자 프로시저 인자)
  • 5. 1.3.1 프로시저를 인자로 받는 프로시저 a~b 까지 정수의 합을 계산하는 프로시저 (define (sum-integers a b)) (if (> a b) 0 (+ a (sum-integers (+ a 1) b))))
  • 6. 1.3.1 프로시저를 인자로 받는 프로시저 시그마 ( 수열의 덧셈 ) 프로시저 (define (<name> a b)) (if (> a b) 0 (+ (<term> a) (<name> (<next> a) b))))
  • 7. 1.3.1 프로시저를 인자로 받는 프로시저 (define (identity x) x) (define (inc n) (+n 1)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (sum-intergers a b)) (sum identity a inc b))
  • 8. 1.3.1 프로시저를 인자로 받는 프로시저 (define (identity x) x) (define (inc n) (+n 1)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (sum-intergers a b)) (sum identity a inc b))
  • 9. 1.3.1 프로시저를 인자로 받는 프로시저 (define (identity x) x) (define (inc n) (+n 1)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (sum-intergers a b)) (sum identity a inc b))
  • 10. 1.3.1 프로시저를 인자로 받는 프로시저 (define (identity x) x) (define (inc n) (+n 1)) (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (sum-intergers a b)) (sum identity a inc b))
  • 11. 1.3.2 lambda로 나타내는 프로시저 임시 함수 ex) (define (identity x) x) define 해서 하나하나 만들기 귀찮다! lambda를 쓰면 작은 프로시저는 따로 만들지 않아도!!
  • 12. 1.3.2 lambda로 나타내는 프로시저 (define (plus4 x) (+ x 4)) (define plus4 (lambda (x) (+ x 4))) (lambda (<parameters>) <body>)
  • 13. 1.3.2 lambda로 나타내는 프로시저 간단히 연습 lambda (define (square z) (z x z)) ((lambda (x y z) (+ x y (square z))) 1 2 3) = ?
  • 14. 1.3.2 lambda로 나타내는 프로시저 간단히 연습 lambda (define (square z) (z x z)) ((lambda (x y z) (+ x y (square z))) 1 2 3) = ?
  • 15. 1.3.2 lambda로 나타내는 프로시저 간단히 연습 lambda (define (square z) (x z z)) ((lambda (x y z) (+ x y (square z))) 1 2 3) = (+ 1 2 (x 3 3)) = 12
  • 16. 1.3.2 lambda로 나타내는 프로시저 let으로 갇힌 변수 만들기 프로시저 안에서만 쓰는 변수(로컬변수) 각각의 리스트가 값을 가지고 바디에 적용 (let ((<var1> <exp1>) (<var2> <exp2>) … (<varn> <expn>)) <body>)
  • 17. 1.3.2 lambda로 나타내는 프로시저 let으로 갇힌 변수 만들기 각각의 리스트가 값을 가지고 바디에 적용 let 외부에서 x는 2라면 (let (x 3) (y (+ x 2)) (* x y)) let 안에서 첫번째 리스트 x는 3 y는 외부의 x를 사용해서 2
  • 18. 1.3.2 lambda로 나타내는 프로시저 let으로 갇힌 변수 만들기 각각의 리스트가 값을 가지고 바디에 적용 let 외부에서 x는 2라면 (let (x 3) //x = 3 (y (+ x 2)) //x = 2 (외부) (* x y)) let 안에서 첫번째 리스트 x는 3 y는 외부의 x를 사용해서 2
  • 19. 1.3.2 lambda로 나타내는 프로시저 let으로 갇힌 변수 만들기 각각의 리스트가 값을 가지고 바디에 적용 let 외부에서 x는 2라면 (let (x 3) //x = 3 (y (+ x 2)) //x = 2 (외부) (* x y)) let 안에서 첫번째 리스트 x는 3 y는 외부의 x를 사용해서 2 결국 body 에는 (* 3 4) => 12
  • 20. 1.3.3 일반적인 방법을 표현하는 프로시저 수뿐 아니라 함수까지 인자로 받아 계산하는 방법만 도려내어 프로시저로 간추림
  • 21. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값
  • 22. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (serarch f neg-point pos-point) (let ((midpoint (average neg-point pos-point))) //가운데 값 정의 (if (close-enough? neg-point pos-point) //값이 근사치인가 midpoint //맞으면 리턴 (let ((test-value (f midpoint))) //아니면 중간값 사용 (cond ((positive? test-value) //0보다 큰가 (serarch f neg-point midpoint) //가까운값 ((negative? test-value) //0보다 작은가 (serarch f midpoint pos-point)) //먼값 (else midpoint)))))) //둘다 아니면 중간값
  • 23. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (serarch f neg-point pos-point) (let ((midpoint (average neg-point pos-point))) //가운데 값 정의 (if (close-enough? neg-point pos-point) //값이 근사치인가 midpoint //맞으면 리턴 (let ((test-value (f midpoint))) //아니면 중간값 사용 (cond ((positive? test-value) //0보다 큰가 (serarch f neg-point midpoint) //가까운값 ((negative? test-value) //0보다 작은가 (serarch f midpoint pos-point)) //먼값 (else midpoint)))))) //둘다 아니면 중간값
  • 24. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (close-enough? x y) // 근접 한가 (< (abs (- x y)) 0.001))
  • 25. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (serarch f neg-point pos-point) (let ((midpoint (average neg-point pos-point))) //가운데 값 정의 (if (close-enough? neg-point pos-point) //값이 근사치인가 midpoint //맞으면 리턴 (let ((test-value (f midpoint))) //아니면 중간값 사용 (cond ((positive? test-value) //0보다 큰가 (serarch f neg-point midpoint) //가까운값 ((negative? test-value) //0보다 작은가 (serarch f midpoint pos-point)) //먼값 (else midpoint)))))) //둘다 아니면 중간값
  • 26. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (serarch f neg-point pos-point) (let ((midpoint (average neg-point pos-point))) //가운데 값 정의 (if (close-enough? neg-point pos-point) //값이 근사치인가 midpoint //맞으면 리턴 (let ((test-value (f midpoint))) //아니면 중간값 사용 (cond ((positive? test-value) //0보다 큰가 (serarch f neg-point midpoint) //가까운값 ((negative? test-value) //0보다 작은가 (serarch f midpoint pos-point)) //먼값 (else midpoint)))))) //둘다 아니면 중간값
  • 27. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (serarch f neg-point pos-point) (let ((midpoint (average neg-point pos-point))) //가운데 값 정의 (if (close-enough? neg-point pos-point) //값이 근사치인가 midpoint //맞으면 리턴 (let ((test-value (f midpoint))) //아니면 중간값 사용 (cond ((positive? test-value) //0보다 큰가 (serarch f neg-point midpoint) //가까운값 ((negative? test-value) //0보다 작은가 (serarch f midpoint pos-point)) //먼값 (else midpoint)))))) //둘다 아니면 중간값
  • 28. 1.3.3 일반적인 방법을 표현하는 프로시저 이분법으로 방정식의 근 찾기 f(a) < 0 < f(b) f(x) > 0 일때 f의 근은 a와 x 사이에 있음 f(x) < 0 일때 f의 근은 b와 x 사이에 있음 분할 탐색 같은 느낌? 이진트리? 처럼 가서 근접점,값 (define (serarch f neg-point pos-point) (let ((midpoint (average neg-point pos-point))) //가운데 값 정의 (if (close-enough? neg-point pos-point) //값이 근사치인가 midpoint //맞으면 리턴 (let ((test-value (f midpoint))) //아니면 중간값 사용 (cond ((positive? test-value) //0보다 큰가 (serarch f neg-point midpoint) //가까운값 ((negative? test-value) //0보다 작은가 (serarch f midpoint pos-point)) //먼값 (else midpoint)))))) //둘다 아니면 중간값
  • 29. 1.3.4 프로시저를 만드는 프로시저 프로시저를 프로시저의 결과 값으로 돌려주는 표현력의 상승 효과!! (define average-dump f) (lambda (x) (average x (f x)))) ((average-dump square) 10)
  • 30. 1.3.4 프로시저를 만드는 프로시저 프로시저를 프로시저의 결과 값으로 돌려주는 표현력의 상승 효과!! (define average-dump f) (lambda (x) (average x (f x)))) ((average-dump square) 10) (10 + 100) / 2 => 55
  • 31. 벌써 마무으리… 프로그래머는 언제나 스스로 짠 프로그램을 놓고 그 속에서 간추릴 게 무엇인지 찾아내어(리팩토링-냄새?), 이로부터 더 수준 높은 표현 수단을 만들어 내려고 애써야 한다(추상화?)
  • 32. 벌써 마무으리… 몇 가지 문제 풀이 방법을 간추려서 다른 문제 풀이에도 다시 쓸수 있도록 일반적인 표현 수단을 만들려고 애쓰는 버릇은 정말 중요하다 (재사용?,일반화?,제네릭?)
  • 33. 정리 프로그래밍 언어의 일등급(first class) (프로시저가) 변수의 값(처럼 사용될 수)이 될 수 있다. 다시 말해, 이름이 붙을 수 있다. (프로시저가) 프로시저의 인자로 쓸 수 있다. (프로시저가) 프로시저의 결과로 만들어질 수 있다. (프로시저가) 데이터 구조속에 집어 넣을수 있다.