Упражнение 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 у.е.
Комментариев нет:
Отправить комментарий