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
((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)))
(split-adder (lambda (split accountlist typefilter)
(split-adder (lambda (split accountlist)
(let* ((transaction (xaccSplitGetParent split))
(splits-in-transaction (xaccTransGetSplitList transaction))
(sum #f))
(for-each (lambda (s)
(let* ((splitAcc (xaccSplitGetAccount s))
(splitVal (if (xaccTransGetVoidStatus transaction)
(split-get-value (lambda (s)
(if (xaccTransGetVoidStatus transaction)
(xaccSplitVoidFormerValue s)
(xaccSplitGetValue s)))
(splitCommodity (xaccAccountGetCommodity splitAcc))
(splitAccType (xaccAccountGetType splitAcc))
(splitAccName (xaccAccountGetName splitAcc)))
(if accountlist
(if (member splitAcc accountlist)
(set! sum (myadd sum splitVal))))
(if typefilter
(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))))
(xaccSplitGetValue s))))
(include-split? (lambda (s) (member (xaccSplitGetAccount s) accountlist)))
(filtered-splits (filter include-split? splits-in-transaction))
(list-of-values (map split-get-value filtered-splits)))
(fold myadd #f list-of-values))))
(tax-on-sales (lambda (s) (split-adder s accounts-tax-collected)))
(tax-on-purchases (lambda (s) (split-adder s accounts-tax-paid)))
(sales-without-tax (lambda (s) (split-adder s accounts-sales)))
(purchases-without-tax (lambda (s) (split-adder s accounts-purchases)))
(account-adder (lambda (acc) (lambda (s) (split-adder s (list acc)))))
(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))))
(bank-remittance (lambda (s) (myneg (myadd (total-sales s) (total-purchases s)))))