이 문제는 연습문제 3.3에서 만든 계정에 다른 이가 접근할 수 있도록

make-joint 프로시저를 만들어야 합니다.

 

c8

잘 되는군요.^^

 

원계정인 peter-acc의 암호는 open-sesame입니다.

따라서 해당 암호로 접근할 수 있습니다.

 

이를 복사한 paul-acc의 암호는 rosebud입니다.

따라서 open-sesame으로 접근할 수 없습니다.(실행줄 6번째 줄)

 

mike-acc는 원계정인 peter-acc의 암호를 제대로 넣지 못해서 에러가 떴습니다.

 

 

방법은 다음과 같습니다.

make-joint를 실행시키면 원계정의 암호가 같은지 확인합니다.

그리고 make-account처럼 dispatch라는 프로시저를 돌려줍니다.

이 프로시저는 패스워드와 메시지를 받아 새로운 패스워드를 확인한 후

처음 생성할 때 저장한 원계정(acc)를 돌려줍니다.

원계정의 비밀번호(password)도 미리 저장하였기에

새로운 패스워드만으로도 접근이 가능합니다.

 

 

참조

해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 308

 

 

(define true (= 0 0))

; answer
; exercise 3.3
(define (make-account balance password)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch pw m)
    (if (eq? m 'right-pw)
        (right-pw? pw)
        (if (eq? pw password)
            (cond ((eq? m 'withdraw) withdraw)
                  ((eq? m 'deposit) deposit)
                  ((eq? m 'how-many-balance) balance)
                  ((eq? m 'how-many-balance) balance)
                  (else (error "Unknown request -- MAKE-ACCOUNT"
                               m)))
            wrongpw)))
  (define (wrongpw amount) "Incorrect password")
  (define (right-pw? pw) (eq? password pw))
  dispatch)

(define (make-joint acc password new-password)
  (define (dispatch pw m)   
    (if (eq? pw new-password) ; 새로운 사용자의 암호가 같은지 확인
        (acc password m)
        wrong-pw))
  (define (wrong-pw amount) "Incorrect password")
  (cond ((acc password 'right-pw) dispatch) ; 계정의 암호가 같은지 확인
      (else (display "Incorrect password") (newline))))

; execute
(define peter-acc (make-account 100 'open-sesame))
(define paul-acc
  (make-joint peter-acc 'open-sesame 'rosebud))
(define mike-acc
  (make-joint peter-acc 'open-sesam 'rosebu))

((peter-acc 'open-sesame 'withdraw) 40)
((peter-acc 'rosebud 'deposit) 50)
((peter-acc 'open-sesame 'deposit) 50)
(newline)
((paul-acc 'open-sesame 'withdraw) 40)
((paul-acc 'rosebud 'withdraw) 40)
((paul-acc 'rosebud 'deposit) 50)

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1432

댓글을 달아 주세요

[로그인][오픈아이디란?]