Данные, защищенные паролем - Lisp
Формулировка задачи:
Недавно начала изучать лисп и столкнулась с такой проблемой:
Есть процедура make-account которая создает счета, защищенные паролем. Непосредственно, что делать с самой процедурой я понимаю, а вот как защитить ее паролем - не совсем. Объясните, пожалуйста))
Вот код, но он не работает((
#lang racket
(define (make-account balance password)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Недостаточно денег на счете"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (secret-password sp)
(cond ((= password sp)
secret-password)
(else (error "Неверный пароль"))))
(define (dispatch m)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
((eq? m 'secret-password) secret-password)
(else (error "Неизвестный вызов -- MAKE-ACCOUNT"
m))))
dispatch)
(define acc (make-account 100 'secret-password))Решение задачи: «Данные, защищенные паролем»
textual
Листинг программы
(define (make-account balance password) (define (wrong-passwd arg) "Incorrect 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 passwrd m) (if (eq? passwrd password) (cond ((eq? m 'withdraw) withdraw) ((eq? m 'deposit) deposit) (else (error "Unknown request -- MAKE-ACCOUNT" m))) wrong-passwd)) dispatch) (define acc (make-account 100 'secret-password)) (display ((acc 'secret-password 'withdraw) 40)) (newline) (display ((acc 'secret-password 'withdraw) 40)) (newline) (display ((acc 'secret-password 'withdraw) 40)) (newline) (display ((acc 'some-other-password 'deposit) 50)) (newline)
Объяснение кода листинга программы
В коде определена функция make-account, которая принимает два аргумента: balance (баланс счёта) и password (пароль). Внутри функции определены три вспомогательные функции:
wrong-passwd(ошибочный пароль) — возвращает строкуIncorrect password.withdraw(снятие средств) — принимает аргументamount(сумма снятия). Если на счёте достаточно средств, то функция уменьшает баланс на снятую сумму и возвращает новую величину баланса. В противном случае возвращается строкаInsufficient funds.deposit(внесение средств) — принимает аргументamount(сумма внесения). Функция увеличивает баланс на внесённую сумму и возвращает новую величину баланса. Также в коде определена функцияdispatch(диспетчер), которая принимает два аргумента:passwrd(пароль) иm(код операции). Если пароль верный, то функция в зависимости от кода операции вызывает соответствующую функцию:withdrawилиdeposit. В противном случае возвращается строкаIncorrect password. В основной части кода создаётся экземпляр счёта с балансом 100 и паролем'secret-password'. Затем с помощью функцииdisplayвыводятся результаты выполнения функцийwithdrawиdepositдля данного экземпляра счёта и пароля'secret-password'. Также выводится результат выполнения функцииdispatchдля пароля'some-other-password'и кода операцииdeposit.