이번 문제는 제가 전에 궁금하였던 여러 인자를 받는 프로시저를 가르쳐줍니다.
C 언어에서는 printf 함수가 대표적이죠.
여기서도 +, -, *, /, list와 같은 프로시저는 인자의 수가 정해지지 않았습니다.
그래서 여러 인자를 넣어도 문제없이 작동하지요.
이런 프로시저를 정의하는 방법 중 하나가
꼬리점 문법(dotted-tail notation)이라고 합니다.
(하나라는 말은 그 외에 다른 여러 방법이 있다는 뜻?)
이 문법은 마지막 인자 이름 앞에 '.'을 찍어 인자 리스트를 받는 것입니다.
예를 들어 (define (f x y . z) <body>) 프로시저는
인자를 두 개 이상 받을 수 있습니다.
또한, (define (g . w) <body>) 프로시저는 0개 이상의 인자를 받을 수 있습니다.
이를 lambda로 정의하면 다음과 같습니다.
(define f (lambda (x y .z) <body>)
(define g (lambda w <body>))
여기서 신기한 것은 인자를 하나만 적으면 된다는 점입니다.
처음에는 '왜 점(.)을 넣지 않을까?' 생각하였으나
인자의 형태를 정의하지 않기 때문에
인자로 프로시저든 숫자든 리스트든 상관이 없습니다.
따라서 굳이 점(.)을 붙일 필요가 없더군요.^^
위의 이 문법을 써서 하나 이상의 정수를 인자로 받아
첫 번째 인자가 짝수이면 짝수만, 홀수이면 홀수만 리스트로 내놓은 프로시저
same-parity를 만드는 문제입니다.

잘 나오는군요.^^
이번에는 append 프로시저를 쓰지 않고 cons로 처리하였습니다.
전에 연습문제 2.18도 그렇게 하고 싶었으나
책에서는 'nil'이라 가르쳐준 글자가 DrScheme에서는 없는 프로시저라고 하더군요.
따라서 그 때는 list 프로시저를 쓸 수밖에 없었는데,
이번에는 혹시나 하는 생각에 nil 대신 null을 넣었습니다.
그러자 제대로 작동하더군요.;;;
연습문제 1.22의 runtime 프로시저가 없어 current-millisecond 프로시저를 쓴것처럼
이번 문제의 nil 프로시저가 없어 null 프로시저를 썼습니다.
이건 언어 문제가 아니라 Implementation의 문제인 듯싶습니다.
처음에 iter 프로시저를 만들 때 리스트 안의 원소가 짝홀인가 확인하고
이것이 nil인가를 다시 한 번 확인하였습니다.
하지만 null? 프로시저를 두 번 적는 효과가 발생하였기에
이를 간단히 하는 방법이 없을까 고민하다가
먼저 nil 여부를 판단하는 것으로 만들었습니다.
그러자 더욱 깔끔하게 보이더군요.^^
이런 생각의 흐름을 기록하고자 해당 코드를 주석으로 처리하여 저장하였습니다.
참조
Structure and Interpretation of Computer Programs 2/E - Page 134
(define (same-parity x . y)
(define (iter remain list)
(if (null? list) ; 마지막인가 아닌가
null
(if (= remain (remainder (car list) 2)) ; 리스트 안의 원소가 짝홀?
(cons (car list) (iter remain (cdr list)))
(iter remain (cdr list))
)
)
)
(cond ((= 0 (remainder x 2))
(cons x (iter 0 y))
)
(else
(cons x (iter 1 y))
)
)
)
(same-parity 1 2 3 4 5 6 7)
(same-parity 2 3 4 5 6 7)
; 처음 구상
;(define (iter remain list)
; (if (= remain (remainder (car list) 2)) ; 리스트 안의 원소가 짝홀?
; (if (null? (cdr list)) ; 마지막인가 아닌가
; (cons (car list) null)
; (cons (car list) (iter remain (cdr list))))
; (if (null? (cdr list)) ; 마지막인가 아닌가
; (cons (car list) null)
; (iter remain (cdr list)))))
; 이는 null을 두 번 물어보는 듯싶어 위의 것을 만들었습니다.
- SICP Exercise 연습문제 2.23 (0)2008/02/04
- SICP Exercise 연습문제 2.22 (0)2008/02/04
- SICP Exercise 연습문제 2.21 (0)2008/02/04
- SICP Exercise 연습문제 2.20 (0)2008/02/02
- SICP Exercise 연습문제 2.19 (0)2008/02/02
- SICP Exercise 연습문제 2.18 (0)2008/02/02
- SICP Exercise 연습문제 2.17 (0)2008/02/02
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요