Совместные счета

Рассмотрим объекты-банковские счета, создаваемые процедурой make-account , и снабженные паролями, как это описано в упражнении 3.3 . Предположим, что наша банковская система требует от нас умения порождать совместные счета. Напишите процедуру make-joint , которая это делает. Make-joint должна принимать три аргумента. Первый из них — защищенный паролем счет. Второй обязан совпадать с паролем, с которым этот счет был создан, иначе make-joint откажется работать. Третий аргумент — новый пароль. Make-joint открывает дополнительный доступ к счету, с использованием нового пароля. Например, если банковский счет peter-acc был создан с паролем open-sesame , то

(define paul-acc
    (make-joint peter-acc 'open-sesame 'rosebud))

позволит нам проводить операции с peter-acc , используя имя paul-acc и пароль rosebud . Вам может потребоваться переработать решение упражнения 3.3 , чтобы добавить эту новую возможность.


Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход
(define (make-account balance secret)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch key m)
    (cond ((eq? key secret)
           (cond ((eq? m 'withdraw) withdraw)
                 ((eq? m 'deposit) deposit)
                 (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
          (else (error "Wrong password"))))
  dispatch)

(define peter-acc (make-account 100 'secret-password))

(define paul-acc
    (make-joint peter-acc 'secret-password 'rosebud))

(check-equal? ((peter-acc 'secret-password 'deposit) 10) 110)
(check-equal? ((paul-acc 'rosebud 'deposit) 10) 120)
(check-equal? ((peter-acc 'secret-password 'withdraw) 20) 100)
(check-equal? ((paul-acc 'rosebud 'withdraw) 85) 15)