2017-01-07 10 views
0

Я все еще ноб в Clojure, правильно знаю, что я пытаюсь решить проблему, связанную с сценарием банковских транзакций для университета.Clojure: Refs пример для банковских операций

Итак ... проблема довольно проста, мне нужно разработать решение для кредитов, дебетовых и денежных переводов.

Я остановился здесь:

(def account 
    (ref 100)) 

(defn credit [account amount] 
    "Credit" 
    (dosync 
    (alter account + amount))) 


(defn debit [account amount] 
    "Debit" 
    (dosync 
    (if (> amount (balance account)) 
     (throw (Exception. "Insuficient Funds")) 
     (alter account - amount)))) 

(defn transfer [from to amount] 
    "Transfer" 
    (dosync 
    (if (<= amount (balance from)) 
     (do 
     (Thread/sleep 10) 
     (debit from amount) 


     (credit to amount)) 
     (throw 
     (Exception. "Insuficient Funds"))))) 

Я думаю, что его ничего не трудно понять и выше код работает.

Я хотел бы добавить номер счета, описание сделки, данные и количества и хранение в памяти в каждой функции выше, как:

(defn credit [account description data amount] 
    "Credit" 
    (dosync 
    (alter account + amount))) 

Я попытался с хэш-картой, векторами и другими вещами, но Бесполезным Не работай. Также я пытаюсь найти это решение в этой книге: Clojure Programming O'reilly, но все еще сложно реализовать.

Спасибо за ваше время и сообщите мне, если вам нужна дополнительная информация.

+2

Что такое ваш вопрос точно ? – jmargolisvt

+0

Я должен добавить другие «параметры» в каждой функции так, как они могут работать, я отредактировал мой вопрос выше, ясно ли это? – junis087678

+1

Не совсем. Прямо сейчас ваша функция 'credit' создает одно значение. Вы хотите, чтобы он произвел ряд ценностей? Итак, '(кредитная учетная запись 20)' будет производить что-то вроде '[120" депозита "timestamp]'? Вы пробовали работать с 'assoc-in'? Что представляют собой «данные»? – jmargolisvt

ответ

0

Итак, я думаю, что нашел способ разработать этот сценарий.

При создании счета в банке, я использую рефов и структуру, чтобы сохранить все необходимые данные (имя счета, номер счета и перечень операций со всеми сделок, которые будут созданы)

(defn create-account [name account-number] 
    "Create account" 
    (ref (merge {:name name :account-number account-number :operations '()}))) 

(def joey 
    "Account for tests" 
    (create-account "joey" 12345678))