Change critical code to pure FP

The function split-adder is the most crucial code  in this report. This commit changes it to pure functional programming.
This commit is contained in:
christopherlam 2017-10-24 08:04:27 +08:00 committed by Christopher Lam
parent 77ab04100c
commit 51a0a55e43

View File

@ -1173,33 +1173,22 @@ for taxes paid on expenses, and type LIABILITY for taxes collected on sales.")
(letrec (letrec
((myadd (lambda (X Y) (if X (if Y (gnc-numeric-add X Y GNC-DENOM-AUTO GNC-RND-ROUND) X) Y))) ((myadd (lambda (X Y) (if X (if Y (gnc-numeric-add X Y GNC-DENOM-AUTO GNC-RND-ROUND) X) Y)))
(myneg (lambda (X) (if X (gnc-numeric-neg X) #f))) (myneg (lambda (X) (if X (gnc-numeric-neg X) #f)))
(split-adder (lambda (split accountlist typefilter) (split-adder (lambda (split accountlist)
(let* ((transaction (xaccSplitGetParent split)) (let* ((transaction (xaccSplitGetParent split))
(splits-in-transaction (xaccTransGetSplitList transaction)) (splits-in-transaction (xaccTransGetSplitList transaction))
(sum #f)) (split-get-value (lambda (s)
(for-each (lambda (s) (if (xaccTransGetVoidStatus transaction)
(let* ((splitAcc (xaccSplitGetAccount s)) (xaccSplitVoidFormerValue s)
(splitVal (if (xaccTransGetVoidStatus transaction) (xaccSplitGetValue s))))
(xaccSplitVoidFormerValue s) (include-split? (lambda (s) (member (xaccSplitGetAccount s) accountlist)))
(xaccSplitGetValue s))) (filtered-splits (filter include-split? splits-in-transaction))
(splitCommodity (xaccAccountGetCommodity splitAcc)) (list-of-values (map split-get-value filtered-splits)))
(splitAccType (xaccAccountGetType splitAcc)) (fold myadd #f list-of-values))))
(splitAccName (xaccAccountGetName splitAcc))) (tax-on-sales (lambda (s) (split-adder s accounts-tax-collected)))
(if accountlist (tax-on-purchases (lambda (s) (split-adder s accounts-tax-paid)))
(if (member splitAcc accountlist) (sales-without-tax (lambda (s) (split-adder s accounts-sales)))
(set! sum (myadd sum splitVal)))) (purchases-without-tax (lambda (s) (split-adder s accounts-purchases)))
(if typefilter (account-adder (lambda (acc) (lambda (s) (split-adder s (list acc)))))
(if (eq? typefilter splitAccType)
(set! sum (myadd sum splitVal))))))
splits-in-transaction)
sum)))
;(sales-without-tax (lambda (s) (split-adder s #f ACCT-TYPE-INCOME)))
;(purchases-without-tax (lambda (s) (split-adder s #f ACCT-TYPE-EXPENSE)))
(tax-on-sales (lambda (s) (split-adder s accounts-tax-collected #f)))
(tax-on-purchases (lambda (s) (split-adder s accounts-tax-paid #f)))
(sales-without-tax (lambda (s) (split-adder s accounts-sales #f)))
(purchases-without-tax (lambda (s) (split-adder s accounts-purchases #f)))
(account-adder (lambda (acc) (lambda (s) (split-adder s (list acc) #f))))
(total-sales (lambda (s) (myadd (tax-on-sales s) (sales-without-tax s)))) (total-sales (lambda (s) (myadd (tax-on-sales s) (sales-without-tax s))))
(total-purchases (lambda (s) (myadd (tax-on-purchases s) (purchases-without-tax s)))) (total-purchases (lambda (s) (myadd (tax-on-purchases s) (purchases-without-tax s))))
(bank-remittance (lambda (s) (myneg (myadd (total-sales s) (total-purchases s))))) (bank-remittance (lambda (s) (myneg (myadd (total-sales s) (total-purchases s)))))