게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

3/14 실습 질문 답변

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Spring 2007)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
공순호



가입: 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의 값을 가지게 됩니다.


인용:

http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-7.html#%_sec_4.2.3

4.2.3 Sequencing

library syntax: (begin <expression1> <expression2> ...)
The <expression>s are evaluated sequentially from left to right, and the value(s) of the last <expression> is(are) returned. This expression type is used to sequence side effects such as input and output.



코드:

> (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로 살펴보시면 좋겠습니다.
위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Spring 2007) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay