суббота, 8 января 2011 г.

Exercise-3-07


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

Может понадобится результат упражнения 3.3, но мы воспользуемся результатами 3.4, так как оно написано почище. В этом случае нам совершенно не надо его перерабатывать, пишем решение в лоб

(define (make-joint orig orig-pass joined-pass)
  (λ (pass . args)
    (if (eq? pass joined-pass)
        (apply orig (cons orig-pass args))
        wrong-pass)))

Предварительна вынеся функцию сообщения неправильного пароля

(define (wrong-pass arg . other) "Неверный пароль")

Тестируем

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

((peter-acc 'open-sesame 'deposit) 10)   ; 110
((peter-acc 'open-sesame 'deposit) 20)   ;130
((paul-acc 'rosebud 'withdraw) 5)   ;125
((peter-acc 'open-sesame 'deposit) 20)    ;145

Как видим, Полу удалось опустошить кошелек Питера на 5 у.е.

Комментариев нет:

Отправить комментарий