Add function to interest-compounder
This commit is contained in:
parent
5f10396af8
commit
e9fead08c2
|
@ -7,74 +7,97 @@
|
||||||
|
|
||||||
(defun principal-initialized ()
|
(defun principal-initialized ()
|
||||||
(setf compounder (interest-compounder 1000 0))
|
(setf compounder (interest-compounder 1000 0))
|
||||||
(assert= 1000 (funcall compounder :get-principal)))
|
(assert= 1000 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun interest-rate-initialized ()
|
(defun interest-rate-initialized ()
|
||||||
(setf compounder (interest-compounder 0 10))
|
(setf compounder (interest-compounder 0 10))
|
||||||
(assert= 10 (funcall compounder :get-interest-rate)))
|
(assert= 10 (call compounder :get-interest-rate)))
|
||||||
|
|
||||||
(defun many-years-with-no-interest-rate ()
|
(defun many-years-with-no-interest-rate ()
|
||||||
(setf compounder (interest-compounder 1000 0))
|
(setf compounder (interest-compounder 1000 0))
|
||||||
(funcall compounder :move-forward-years 83)
|
(call compounder :move-forward-years 83)
|
||||||
(assert= 1000 (funcall compounder :get-principal)))
|
(assert= 1000 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun no-years-with-positive-interest-rate ()
|
(defun no-years-with-positive-interest-rate ()
|
||||||
(setf compounder (interest-compounder 1000 10))
|
(setf compounder (interest-compounder 1000 10))
|
||||||
(assert= 1000 (funcall compounder :get-principal)))
|
(assert= 1000 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun one-year-with-positive-interest-rate ()
|
(defun one-year-with-positive-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 5))
|
(setf compounder (interest-compounder 100000 5))
|
||||||
(funcall compounder :move-forward-one-year)
|
(call compounder :move-forward-years 1)
|
||||||
(assert= 105000 (funcall compounder :get-principal)))
|
(assert= 105000 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun two-years-with-positive-interest-rate ()
|
(defun two-years-with-positive-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 5))
|
(setf compounder (interest-compounder 100000 5))
|
||||||
(funcall compounder :move-forward-one-year)
|
(call compounder :move-forward-years 2)
|
||||||
(funcall compounder :move-forward-one-year)
|
(assert= 110250 (call compounder :get-principal)))
|
||||||
(assert= 110250 (funcall compounder :get-principal)))
|
|
||||||
|
|
||||||
(defun three-years-with-positive-interest-rate ()
|
(defun three-years-with-positive-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 5))
|
(setf compounder (interest-compounder 100000 5))
|
||||||
(funcall compounder :move-forward-years 3)
|
(call compounder :move-forward-years 3)
|
||||||
(assert= 115763 (funcall compounder :get-principal)))
|
(assert= 115763 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun four-years-with-positive-interest-rate ()
|
(defun four-years-with-positive-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 5))
|
(setf compounder (interest-compounder 100000 5))
|
||||||
(funcall compounder :move-forward-years 4)
|
(call compounder :move-forward-years 4)
|
||||||
(assert= 121551 (funcall compounder :get-principal)))
|
(assert= 121551 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun one-year-with-negative-interest-rate ()
|
(defun one-year-with-negative-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 -5))
|
(setf compounder (interest-compounder 100000 -5))
|
||||||
(funcall compounder :move-forward-years 1)
|
(call compounder :move-forward-years 1)
|
||||||
(assert= 95000 (funcall compounder :get-principal)))
|
(assert= 95000 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun two-years-with-negative-interest-rate ()
|
(defun two-years-with-negative-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 -5))
|
(setf compounder (interest-compounder 100000 -5))
|
||||||
(funcall compounder :move-forward-years 2)
|
(call compounder :move-forward-years 2)
|
||||||
(assert= 90250 (funcall compounder :get-principal)))
|
(assert= 90250 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun three-years-with-negative-interest-rate ()
|
(defun three-years-with-negative-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 -5))
|
(setf compounder (interest-compounder 100000 -5))
|
||||||
(funcall compounder :move-forward-years 3)
|
(call compounder :move-forward-years 3)
|
||||||
(assert= 85737 (funcall compounder :get-principal)))
|
(assert= 85737 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun four-years-with-negative-interest-rate ()
|
(defun four-years-with-negative-interest-rate ()
|
||||||
(setf compounder (interest-compounder 100000 -5))
|
(setf compounder (interest-compounder 100000 -5))
|
||||||
(funcall compounder :move-forward-years 4)
|
(call compounder :move-forward-years 4)
|
||||||
(assert= 81450 (funcall compounder :get-principal)))
|
(assert= 81450 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun negative-number-of-years-does-nothing ()
|
(defun negative-number-of-years-does-nothing ()
|
||||||
(setf compounder (interest-compounder 100000 5))
|
(setf compounder (interest-compounder 100000 5))
|
||||||
(funcall compounder :move-forward-years -4)
|
(call compounder :move-forward-years -4)
|
||||||
(assert= 100000 (funcall compounder :get-principal))
|
(assert= 100000 (call compounder :get-principal))
|
||||||
(funcall compounder :move-forward-years 1)
|
(call compounder :move-forward-years 1)
|
||||||
(funcall compounder :move-forward-years -4)
|
(call compounder :move-forward-years -4)
|
||||||
(assert= 105000 (funcall compounder :get-principal)))
|
(assert= 105000 (call compounder :get-principal)))
|
||||||
|
|
||||||
(defun zero-number-of-years-does-nothing ()
|
(defun zero-number-of-years-does-nothing ()
|
||||||
(setf compounder (interest-compounder 100000 5))
|
(setf compounder (interest-compounder 100000 5))
|
||||||
(funcall compounder :move-forward-years 0)
|
(call compounder :move-forward-years 0)
|
||||||
(assert= 100000 (funcall compounder :get-principal))
|
(assert= 100000 (call compounder :get-principal))
|
||||||
(funcall compounder :move-forward-years 1)
|
(call compounder :move-forward-years 1)
|
||||||
(funcall compounder :move-forward-years 0)
|
(call compounder :move-forward-years 0)
|
||||||
(assert= 105000 (funcall compounder :get-principal))))))
|
(assert= 105000 (call compounder :get-principal)))
|
||||||
|
|
||||||
|
(defun variable-interest-rate ()
|
||||||
|
(setf compounder (interest-compounder 100000 5))
|
||||||
|
(call compounder :move-forward-years 2)
|
||||||
|
(call compounder :set-interest-rate 10)
|
||||||
|
(call compounder :move-forward-years 2)
|
||||||
|
(assert= 133403 (call compounder :get-principal)))
|
||||||
|
|
||||||
|
(defun years-are-updated ()
|
||||||
|
(setf compounder (interest-compounder 100000 5))
|
||||||
|
(call compounder :move-forward-years 27)
|
||||||
|
(assert= 27 (call compounder :get-years-passed)))
|
||||||
|
|
||||||
|
(defun negative-number-of-years-does-not-update-years ()
|
||||||
|
(setf compounder (interest-compounder 100000 5))
|
||||||
|
(call compounder :move-forward-years 27)
|
||||||
|
(call compounder :move-forward-years -2)
|
||||||
|
(assert= 27 (call compounder :get-years-passed)))
|
||||||
|
|
||||||
|
(defun zero-number-of-years-does-not-update-years ()
|
||||||
|
(setf compounder (interest-compounder 100000 5))
|
||||||
|
(call compounder :move-forward-years 27)
|
||||||
|
(call compounder :move-forward-years 0)
|
||||||
|
(assert= 27 (call compounder :get-years-passed))))))
|
||||||
|
|
|
@ -3,12 +3,17 @@
|
||||||
(defun interest-compounder (initial-principal initial-interest-rate)
|
(defun interest-compounder (initial-principal initial-interest-rate)
|
||||||
(let ((private) (public)
|
(let ((private) (public)
|
||||||
(principal initial-principal)
|
(principal initial-principal)
|
||||||
(interest-rate initial-interest-rate))
|
(interest-rate initial-interest-rate)
|
||||||
|
(years-passed 0))
|
||||||
|
|
||||||
(setf private
|
(setf private
|
||||||
(eval
|
(eval
|
||||||
(dlambda
|
(dlambda
|
||||||
|
|
||||||
|
(:add-years (years)
|
||||||
|
(if (> years 0)
|
||||||
|
(setf years-passed (+ years-passed years))))
|
||||||
|
|
||||||
(:percent-of-number (n percentage)
|
(:percent-of-number (n percentage)
|
||||||
(if (> percentage 0)
|
(if (> percentage 0)
|
||||||
(/ (+ (* n percentage) 50) 100)
|
(/ (+ (* n percentage) 50) 100)
|
||||||
|
@ -26,14 +31,19 @@
|
||||||
(eval
|
(eval
|
||||||
(dlambda
|
(dlambda
|
||||||
|
|
||||||
|
(:get-years-passed ()
|
||||||
|
years-passed)
|
||||||
|
|
||||||
(:get-principal ()
|
(:get-principal ()
|
||||||
principal)
|
principal)
|
||||||
|
|
||||||
(:get-interest-rate ()
|
(:get-interest-rate ()
|
||||||
interest-rate)
|
interest-rate)
|
||||||
|
|
||||||
(:move-forward-one-year ()
|
(:set-interest-rate (new-interest-rate)
|
||||||
(call private :compound-interest 1))
|
(setf interest-rate new-interest-rate))
|
||||||
|
|
||||||
(:move-forward-years (years)
|
(:move-forward-years (years)
|
||||||
(call private :compound-interest years)))))))
|
(progn
|
||||||
|
(call private :add-years years)
|
||||||
|
(call private :compound-interest years))))))))
|
||||||
|
|
Loading…
Reference in New Issue