이 문제는 각 부서별로 관리하는 데이터베이스를
하나로 모아 처리하는 프로시저를 만드는 문제입니다.
말은 거창하지만 그 개략적인 것만 얘기합니다.

소스는 위와 같습니다.
a.
get-record는 위에서 만들었습니다.
(밑에 소스로 표시하겠습니다.)
get-record는 부서(division), 파일(file), 직원명(employee_name)을 인자로 받아
각 부서에 맞는 get-record 프로시저를 찾아 실행시킵니다.
따라서 각 부서 파일에는 그에 맞는 get-record 프로시저를 만들어 put하여야합니다.
b.
get-salary는 부서(division)과 기록(record)를 인자로 받습니다.
여기서 기록은 위에서 적은 get-record 프로시저를 돌린 결과입니다.
레코드가 어떤 구조를 갖추어야 하는지는 잘 모르겠습니다.
(그 문제의 뜻을 이해하지 못했다가 정답인 듯....)
c.
find-employee-record 프로시저는 인자로 직원 이름과 파일 리스트를 받으니
그 둘을 받아 각 파일에 get-record 프로시저를 돌리면 됩니다.
소스 안의 (division (car file_l))은 해당 파일의 부서를 내놓는 프로시저입니다.
사실 get-record 프로시저를 만들 때 file을 넣어야 하는가 고민하였습니다.
문제를 보면 '부서마다 인사 기록이 한 파일에 들어 있고'라고 되어있기에,
부서만 인자로 넘겨주면 그 파일을 찾는 것은 어렵지 않다고 생각했습니다.
하지만 c번 문제에서 파일 리스트라는 얘기를 하여 파일을 인자로 받게 하였습니다.
그럼 부서가 필요없을 듯싶지만
각 부서마다 구조가 다르기에 get-record 프로시저도 달라야합니다.
즉, 부서가 데이터 타입이 되는 것이지요.
그래서 뺄 수도 없으니 참으로 어렵습니다.;;;
d.
기록 파일에 위에서 만든 것 중 없는 것을 추가한 후
put 프로시저를 써서 표에 추가하여야합니다.
그 외에는 달라져야 할 것이 없는 듯싶습니다.
참조
해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 240
; a
(define (get-record division file employee_name)
((get 'get-record division)) file employee_name)
; interface
(put 'get-record '(division_name) get-record)
; b
(define (get-salary division record)
((get 'get-salary division) record))
; interface
(put 'get-salary '(division_name) get-salary)
; c
(define (find-employee-record employee_name file_list)
(define (iter file_l)
(let ((result (get-record (division (car file_l)) (car file_l) employee_name)))
(cond ((null? file_l) false)
((not (null? result)) result)
(else (iter (cdr file_l))))))
(iter null file_list))
; d
- SICP Exercise 연습문제 2.77 (0)2008/02/27
- SICP Exercise 연습문제 2.76 (0)2008/02/26
- SICP Exercise 연습문제 2.75 (0)2008/02/26
- SICP Exercise 연습문제 2.74 (0)2008/02/26
- SICP Exercise 연습문제 2.73 (0)2008/02/26
- SICP Exercise 연습문제 2.72 (0)2008/02/25
- SICP Exercise 연습문제 2.71 (0)2008/02/25
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요