공순호
가입: 2005년 9월 29일 올린 글: 363 위치: 302동 312-2호
|
올려짐: 2007년3월14일 23:02 주제: 3/14 실습 질문 답변 |
|
|
안녕하세요, 공순호 조교 입니다.
1. begin
expression들을 이어서 쓰고 싶다고 해서
(e_1 e_2 ... e_n)로 하시면 원하는 결과를 얻을 수 없습니다.
(begin e_1 e_2 ... e_n)을 수행하면 e_1, e_2 ... e_n을 차례대로 수행하고
전체 (begin e_1 ... e_n)의 값은 e_n의 값을 가지게 됩니다.
코드: |
> (if
(> 10 0)
(begin
(display "This is Than-part.")
(newline)
10
)
0
)
This is Than-part.
10
|
2. define 설탕 녹이기
오늘 마지막 문제(composition) 잘 해결하셨나요?
보통 다음과 같이 문제를 해결합니다.
코드: |
sol1.
(define (compose f g)
(lambda (x)
(f (g x)))
)
|
오늘 어떤 학생은 다음과 같이 문제를 해결했습니다.
코드: |
sol2.
(define ((compose f g) x)
(f (g x))
)
|
사실 sol1 과 sol2는 동일한 것을 구현한 것입니다. 단지 lambda를 쓰느냐, define을 이용해서 function을 정의하느냐의 차이입니다. 하지만, 한 눈에 보기에는 define이 어떻게 녹아서 lambda가 되는지가 쉽게 보이지 않지요.
기본적으로 define을 이용한 function definition은 다음과 같이 설탕이 녹습니다.
코드: |
(define (function_name arg_1 ... arg_n) body)
=>
(define function_name
(lambda (arg_1 ... arg_n) body))
|
"어떤 학생"의 solution을 다시 살펴보면
코드: |
sol2.
(define ((compose f g) x)
(f (g x))
)
|
function_name 부분에 들어간 것이 (compose f g)인 것을 알 수 있습니다.
이런 것이 가능한가? 하는 의문을 품으실 수가 있는대요.
인용: |
http://download.plt-scheme.org/doc/360/html/mzscheme/mzscheme-Z-H-2.html#node_sec_2.8.1
2.8.1 Definitions
A procedure definition
(define variable (lambda formals expr ···1))
can be abbreviated
(define (variable . formals) expr ···1)
In addition to this standard Scheme abbreviation, MzScheme supports an MIT-style generalization, so that a definition
(define header (lambda formals expr ···1))
can be abbreviated
(define (header . formals) expr ···1))
even if header is itself a parenthesized procedure abbreviation. The general syntax of define is as follows:
(define variable expr)
(define (header . formals) expr ···1)
header is one of
variable
(header . formals)
formals is one of
variable
(variable ···)
(variable variable ··· . variable)
|
중간에 보시면 "MIT-style generalization" 이라는 것이 나와서, define에서 단순히 variable만을 define하는 것이 아니라, header라는 것에 대해서도 define이 가능하다는 것을 보실 수 있습니다. (중간에 . 이 들어가는 것, 지금은 이해하기 어려운 예제 부분은 skip 해주시면 됩니다.)
즉,
header -> variable | (header formals) 로 정의되는 header에 대해서
(define (header formals) body)) 가
(define header (lambda (formals) body)) 로 바뀔 수 있는 것입니다.
어떤 학생의 code 를 위의 (define (header formals) body))에 대입해보면
header => (compose f g)
formals => x
body => (f (g x))
가 되고, 이것을 녹이면
(define header (lambda (formals) body))
=> (define (compose f g) (lambda (x) (f (g x)))
가 되는 것 입니다.
이해하시는데 도움되셨으면 좋겠네요.
3.
어떤 것이 되는지 안되는지를 아는 것도 중요하지만,
그 이유에 대해서도 명확하게 이해하는 것이 중요합니다.
프로그래밍 언어에 대해서는 그 명세를 알아두는 것이 도움이 될 때가 많습니다.
scheme에 관해서는
1. http://www.schemers.org/Documents/Standards/R5RS/HTML/
2. http://download.plt-scheme.org/doc/360/html/mzscheme/
두 곳을 reference로 살펴보시면 좋겠습니다. |
|